Низът за зареждане на Simplexml не работи. Обработка на SimpleXML с PHP. Намиране на името на канала

Библиотека за маркиране за парсване на XML с PHP

PHP версия 5 представя SimpleXML, нов интерфейс за програмиране на приложения (API) за четене и писане на XML. SimpleXML разширения като

$doc->rss->channel->item->title

изберете елементи от документа. Стига да имате добра представа за структурата на вашия документ, писането на тези изрази е лесно. Ако обаче не знаете точно къде се появяват интересуващите ви елементи (какъвто е случаят с Docbook, HTML и други подобни текстови документи), SimpleXML може да използва XPath изрази, за да намери тези елементи.

Първи стъпки с SimpleXML

Да приемем, че искате да създадете PHP страница, която преобразува RSS емисия в HTML код. RSSе основният XML формат за публикуване на съдържание от множество източници. Основният елемент на този документ е rss, който съдържа един елемент на канала. Елементът на канала съдържа метаданни за съдържанието, включително неговото заглавие, език и URL адрес. Той също така съдържа различни текстови елементи, вложени в елементи на елемент. Всеки елемент на елемент има елемент на връзка, който съдържа URL адрес или заглавие, или описание (обикновено и двете), които съдържат четим текст. Не се използват пространства от имена. Разбира се, има още какво да се каже за RSS, но за целите на тази статия информацията е достатъчна. показва типичен пример с няколко информационни съобщения.

Списък 1. RSS емисия
Mokka mit Schlag http://www.elharo.com/blog en Penn Station: Изчезнал, но не забравен Старата станция Penn в Ню Йорк беше съборена преди да се родя. Гледайки тези снимки, това се чувства като грешка. Настоящият сайт е функционален, но не повече; всъщност само няколко офис кули и подземни коридори без особен интерес или красота. Новият Медисън Скуеър... http://www.elharo.com/blog/new-york/2006/07/31/penn-station Лично за Елиът Харолд Някои хора използват много неприятни спам филтри, които изискват да въведете произволен низ в темата си, като E37T, за да преминете. Излишно е да казвам, че нито аз, нито повечето други хора си правят труда да общуват с тези параноици. Те грубо реагират прекалено много на проблема със спама. Лично аз няма да... http://www.elharo.com/blog/tech/2006/07/28/personal-for-elliotte-harold/

Нека направим PHP страница, която форматира всяка RSS емисия като HTML. показва структурата на бъдещата страница.

Листинг 2. Статична структура за PHP код
<?php // Заголовок будет читаться из RSS ?>



Разбор на XML документ

Първата стъпка е да анализирате XML документа и да го съхраните в променлива. Това изисква написването само на един ред код, който предава URL адреса на функцията simplexml_load_file():

$rss = simplexml_load_file("http://partners.userland.com/nytRss/nytHomepage.xml");
Внимание

Използваната тук схема е опасно далеч от оптималната. Наистина не трябва да изтеглям и анализирам RSS емисията при всяко посещение на страницата. Това забавя читателите на страницата и е потенциален отказ на услуга за RSS емисиите, които изтеглям, тъй като повечето от тях задават максималната си скорост на актуализиране на около веднъж на час. Истинското решение на този проблем е да се кешира или генерираната HTML страница, или RSS емисиите, или и двете. Този въпрос обаче е в противоречие с използването на библиотеката SimpleXML, така че тук малко преувеличавам.

За този пример взех страница от канала Userland Ню Йорк Таймсна http://partners.userland.com/nytRss/nytHomepage.xml. Разбира се, вместо това можете да използвате всеки друг URL адрес за различен RSS канал.

Имайте предвид, че въпреки името simplexml_load_ файл(), тази функция ще трябва да анализира XML документа на отдалечения HTTP URL адрес. Но това не е единствената изненада в тази функция. Върнатата стойност на функцията, която се съхранява тук в променливата $rss, не сочи към целия документ, както бихте могли да очаквате от опита с други API, като Document Object Model (DOM). По-скоро сочи към основния елемент на документа. Съдържанието, което е в пролога и епилога на документа, не е достъпно от SimpleXML.

Намиране на името на канала

Името на целия канал (за разлика от заглавията на отделните текстови части на този канал) е в дъщерния елемент на заглавието на елемента на канала, който произлиза от коренния елемент на rss. Можете да заредите този хедър, сякаш XML документът е само сериализирана форма на rss обект с поле канал, което от своя страна би имало поле заглавие. Използвайки обикновен PHP референтен синтаксис на обект, този оператор намира заглавката:

$title = $rss->channel->title;

След като намерите заглавието, трябва да го добавите към HTML изхода. Лесно е да се направи: повторете променливата $title:

<?php echo $title; ?>

Този ред извежда низовата стойност на елемента, но не целия елемент. Тоест текстът се записва, но таговете не.

Можете дори да пропуснете изцяло междинната променлива $title:

<?php echo $rss->канал->заглавие; ?>

Тъй като тази страница използва повторно тази стойност на много места, намирам за по-удобно да я съхранявам като променлива с описателно заглавие.

Итерация през елементи

$rss->канал->елемент

Каналите обаче обикновено съдържат повече от един елемент. А може и изобщо да не съществуват. Съответно този оператор връща масив, който можете да итерирате с цикъл for-each:

foreach ($rss->channel->item като $item) ( ехо "

". $item->title."

"; ехо "

". $item->описание."

"; }
Списък 3. Прост, но завършен RSS четец на PHP
канал->заглавие; ?> <?php echo $title; ?>

канал->елемент като $елемент) ( ехо "

връзка. ">".$item->title. "

"; ехо "

". $item->описание."

"; } ?>

Това е всичко, което е необходимо, за да напишете прост RSS четец на PHP - няколко реда HTML и няколко реда PHP. Без интервали, общо 20 реда. Разбира се, това не е най-богатата на функции, оптимизирана или надеждна разработка. Нека да видим какво можем да направим, за да поправим това.

Обработка на грешка

Не всички RSS емисии са толкова добре оформени, колкото би трябвало да бъдат. XML спецификацията изисква процесорите да спрат обработката на документи веднага щом бъде открита формална грешка, а SimpleXML отговаря на програмата за обработка на XML. Това обаче няма да ви помогне много, когато се открие грешка. Обикновено програмата записва предупреждение във файла за грешка на php (но без подробно съобщение за грешка) и функцията simplexml-load-file() извежда грешка. Ако не сте сигурни дали файлът, който анализирате, е добре изграден, проверете за тази грешка, преди да използвате данните от файла, както е показано в .

Списък 4. Пазете се от неправилен вход
xpath("//title") като $title) ( echo "

". $title. "

"; ) ) else ( echo "Ами сега! Въведеното е неправилно!"; ) ?>

Друга често срещана грешка се случва, когато документът е добре форматиран, но не съдържа елементите, които очаквате, където очаквате да бъдат. Какво се случва например с такъв израз $doc->rss->channel->item->title , когато групата елементи няма заглавие (както се случва с поне един от стоте най-чести RSS емисии)? Най-простият подход е винаги да се третира върнатата стойност на функция като масив от данни и да се обвие в цикъл. В този случай вие сте защитени от факта, че има повече или по-малко елементи, отколкото сте очаквали. Въпреки това, ако знаете, че искате първия елемент в документа, дори ако има повече от един, можете да направите заявка за него чрез индекс, базиран на нула. Например, за да поискате заглавието на първата група елементи, можете да напишете:

$doc->rss->channel->item->title

Ако първата група от елементи липсва или няма име, тя се третира по същия начин като всеки друг индекс извън границите в PHP масив. Тоест резултатът е нула, което се превръща в празен низ, когато се опитате да го поставите в изходния HTML код.

Разпознаването и отхвърлянето на неочаквани формати, с които не сте подготвени да работите, обикновено е домейн на валидиращ XML парсер. SimpleXML обаче не може да валидира спрямо DTD шаблон (DTD) или схема на данни. Проверява само формалната коректност.

Как се работи с пространство от имена

Много сайтове днес преминават от RSS към Atom. показва примерен документ в Atom. Този документ е идентичен в много отношения с примера за RSS. Тук обаче има повече метаданни и основният елемент е feed вместо rss. Елементът feed има списъци вместо елементи. Елементът съдържание замества елемента описание. По-важното е, че Atom документ използва пространство от имена, докато RSS не го прави. По този начин Atom документ може да изведе истинско, неизрязано съдържание на Extensible HTML (XHTML).

Списък 5. Документ в Atom
2006-08-04T16:00:04-04:00 http://www.cafeconleche.org/ Cafe con Leche XML новини и ресурси Авторско право 2006 Елиът Ръсти Харолд Стив Палмър публикува бета версия на Vienna 2.1, RSS/Atom клиент с отворен код за Mac OS X.

Стив Палмър публикува бета версия на Vienna 2.1, RSS/Atom клиент с отворен код за Mac OS X. Vienna е първият четец, който намирам за приемлив за ежедневна употреба; не е страхотен, но е достатъчно добър. (Разбира се моите стандарти за „добро“ достатъчно" са доста високи.) 2.1 се фокусира върху подобряването на потребителския интерфейс с унифицирано оформление, което ви позволява да превъртате през няколко статии, филтриране на статии (напр. прочетете всички статии от последното опресняване), ръчно пренареждане на папки, нов прозорец за получаване на информация и подобрено съкратено оформление.

http://www.cafeconleche.org/#August_1_2006_25279 2006-08-01T07:01:19Z
Matt Mullenweg пусна Wordpress 2.0.4, блог двигател, базиран на PHP и MySQL.

Matt Mullenweg пусна Wordpress 2.0.4, блог двигател, базиран на PHP и MySQL. 2.0.4 запушва различни дупки в сигурността, най-вече включващи добавки.

http://www.cafeconleche.org/#August_1_2006_21750 2006-08-01T06:02:30Z

Въпреки че имената на елементите са променени, основният подход за работа със SimpleXML в документи в Atom е същият като при RSS. Единствената разлика е, че трябва да посочите пространството от имена, т.е. Uniform Resource Identifier (URI), когато поискате елемент с име, точно като локално име. Това е процес в две стъпки: първо, заявете дъщерните елементи в даденото пространство от имена, като подадете URI на пространството от имена към функцията children(). След това потърсете елементи с правилното локално име в това пространство от имена. Представете си, че първо сте заредили Atom feed в променливата $feed, така:

$feed = simplexml_load_file("http://www.cafeconleche.org/today.atom");

Тези два реда сега намират заглавния елемент:

$children = $feed->children("http://www.w3.org/2005/Atom"); $title = $children->title;

Можете да съкратите този код в един израз, ако желаете, въпреки че низът става малко дълъг. Всички други елементи в пространствата от имена трябва да се обработват по същия начин. показва пълна PHP страница, която показва заглавките от наименуваната Atom тръба.

Листинг 6. Прост PHP четец на заглавки Atom
деца ("http://www.w3.org/2005/Atom"); $title = $children->title; ?> <?php echo $title; ?>

влизане; foreach ($entries като $entry) ( $details = $entry->children("http://www.w3.org/2005/Atom"); echo "

". $details->title. "

"; } ?>

Смесено съдържание

Защо показах само заглавките в този пример? Тъй като в Atom съдържанието на всеки списък може да съдържа пълния текст на фрагмента и не само самия текст, но и цялото маркиране. То - наративна структура: думите в един ред са предназначени да бъдат прочетени от хората. Както при повечето данни от този вид, тук има смесено съдържание. XML вече не е опростен и така подходът SimpleXML започва да се проваля. Не може да работи правилно със смесено съдържание и това пропускане на данни изключва използването в много случаи.

Можете да направите едно нещо, но това е само частично решение на проблема. Ще работи само защото елементът на съдържанието съдържа истински XHTML. Можете да копирате този XHTML като неанализиран изходен код директно в крайния продукт, като използвате функцията asXML(), например, както следва:

ехо "

". $details->content->asXML()."

";

Резултатът ще бъде нещо подобно.

Листинг 7. XML изход

Николай Григориев пусна SVGMath 0.3, презентационен MathML формат, който произвежда SVG, написан на чист Python и публикуван под лиценз на MIT. Според Григориев, „новата версия може да работи с документи с множество пространства от имена (напр. замяна на всички поддървета на MathML с SVG в XSL-FO или XHTML документ); конфигурацията е направена по-гъвкава и са коригирани няколко грешки. Има и таблица със стилове за коригиране на вертикалната позиция на полученото SVG изображение в XSL-FO."

Това не е чист XHTML. Елементът на съдържанието се извлича от Atom на документа и всъщност е по-добре да го нямате. Дори по-лошо, той влиза в грешното пространство на имената, така че не може да бъде разпознат какво представлява. За щастие този допълнителен елемент не вреди много на практика, тъй като уеб браузърите просто игнорират всички етикети, които не разпознават. Готовият документ е дефектен, но това няма особено значение. Ако наистина ви притеснява, анулирайте го с операции с низове, като това:

$description = $details->content->asXML(); $тагове = масив(" ", ""); $notags = array("", ""); $description = str_replace($tags, $notags, $description);

За да направите кода малко по-стабилен, използвайте регулярен израз, вместо да приемате, че началният таг е точно както е показано по-горе. По-специално можете да изчислите много възможни атрибути:

// крайният етикет има фиксирана форма, така че е лесно да се замени $description = str_replace("", "", $description); // премахнете началния таг, включително атрибути и бяло пространство, ако е възможно $description = ereg_replace(" ]*>", "", $описание);

Дори и с тази модификация вашият код може да издава коментари, изчислителни команди и CDATA парчета. Така или иначе го отрязвате, макар че се страхувам, че вече не е толкова лесно. Смесеното съдържание просто преминава границите, в които SimpleXML е проектиран да работи.

XPath

Изрази като $rss->channel->item->title са чудесни само ако знаете точно какви елементи има в документа и точно къде се намират. Вие обаче не винаги знаете това. Например в XHTML елементите в заглавката (h1, h2, h3 и т.н.) могат да бъдат деца на body, div, table и няколко други елемента. Освен това div, table, blockquote и други елементи могат да бъдат вложени многократно. За много по-малко специфични случаи на употреба е по-лесно да използвате XPath изрази като //h1 или //h1. SimpleXML има този набор от функционалности чрез функцията xpath().

Листинг 9. Използване на XPath с пространства от имена
$atom = simplexml_load_file("http://www.cafeconleche.org/today.atom"); $atom->registerXPathNamespace("atm", "http://www.w3.org/2005/Atom"); $titles = $atom->xpath("//atm:title"); foreach ($titles като $title) ( ехо "

". $title. "

"; }

Едно последно предупреждение: XPath в PHP е доста бавен. Зареждането на страницата може да отнеме от момент до няколко секунди, когато превключа към този XPath израз, дори на ненатоварен локален сървър. Ако използвате тези трикове, трябва да използвате някакъв вид кеширане, за да работите интелигентно. Динамичното генериране на всяка страница просто няма да работи.

Заключение

SimpleXML е полезно допълнение към инструментариума на PHP разработчиците, стига да не е необходимо да работите със смесено съдържание. Това обхваща голям брой случаи на употреба. Това работи особено добре с прости данни под формата на записи. Докато документът не е твърде задълбочен, твърде сложен и няма смесено съдържание, SimpleXML е много по-опростен от своята DOM алтернатива. Също така помага, ако знаете структурата на документа преди време, въпреки че използването на XPath може да облекчи много това изискване. Липсата на валидиране и поддръжка за смесено съдържание е неудобство, а не винаги пречка. Много прости формати нямат смесено съдържание и в много случаи на употреба се използват само много предвидими формати на данни. Ако това е, което характеризира вашата работа, не се колебайте да опитате SimpleXML. С малко внимание към грешките и малко усилия за настройка на кеша, за да се намалят проблемите с производителността до минимум, SimpleXML може да бъде стабилен, толерантен към грешки инструмент за обработка на XML в PHP.

Разборът на XML по същество означава преминаване през XML документ и връщане на съответните данни. Въпреки че нарастващ брой уеб услуги връщат данни във формат JSON, повечето все още използват XML, така че е важно да овладеете анализирането на XML, ако искате да използвате пълния набор от налични API.

Използване на разширението SimpleXMLв PHP, който беше добавен обратно в PHP 5.0, работата с XML е много лесна и проста. В тази статия ще ви покажа как да го направите.

Основи на използването

Да започнем със следния пример езици.xml:


>

> 1972>
> Денис Ричи >
>

> 1995>
> Расмус Лердорф >
>

> 1995>
> Джеймс Гослинг >
>
>

Този XML документ съдържа списък с езици за програмиране с известна информация за всеки език: годината на внедряването му и името на неговия създател.

Първата стъпка е да заредите XML с помощта на функциите simplexml_load_file(), или simplexml_load_string(). Както подсказва името на функциите, първата ще зареди XML от файл, а втората ще зареди XML от низ.

И двете функции четат цялото DOM дърво в паметта и връщат обект SimpleXMLElement. В горния пример обектът се съхранява в променливата $languages ​​​​. Можете да използвате функции var_dump()или print_r()за да получите подробна информация за върнатия обект, ако желаете.

Обект SimpleXMLElement
[lang] => Масив
[ 0 ] => SimpleXMLElementObject
[@attributes] => Масив
[име] => C
[появил се] => 1972г
[ създател] => Денис Ричи
[ 1 ] => Обект SimpleXMLElement
[@attributes] => Масив
[име] => PHP
[появил се] => 1995г
[ създател] => Расмус Лердорф
[ 2 ] => Обект SimpleXMLElement
[@attributes] => Масив
[име] => Java
[появил се] => 1995г
[ създател] => Джеймс Гослинг
)
)

Този XML съдържа основния елемент езици, който съдържа три елемента езикВсеки елемент от масива съответства на елемент езикв XML документ.

Можете да получите достъп до свойствата на обект с помощта на оператора -> . Например $languages->lang ще ви върне обект SimpleXMLElement, който съответства на първия елемент език. Този обект съдържа две свойства: появил се и създател.

$languages ​​​​-> lang [0] -> появи се;
$languages ​​​​-> lang [0] -> създател;

Показването на списък с езици и показването на техните свойства е много лесно със стандартен цикъл, като напр за всеки.

foreach ($languages ​​​​-> lang като $lang ) (
printf (
"" ,
$lang["име"],
$lang -> се появи,
$lang -> създател
) ;
}

Забележете как получих достъп до името на атрибута на елемента lang, за да получа името на езика. По този начин можете да получите достъп до всеки атрибут на елемент, представен като SimpleXMLElement обект.

Работа с пространства от имена

Докато работите с XML на различни уеб услуги, често ще срещате пространства от имена на елементи. Нека променим нашите езици.xmlза да покажете пример за използване на пространство от имена:



xmlns:dc =>

> 1972>
> Денис Ричи >
>

> 1995>
> Расмус Лердорф >
>

> 1995>
> Джеймс Гослинг >
>
>

Сега елемент създателпоставени в пространството на имената dc, което сочи към http://purl.org/dc/elements/1.1/. Ако се опитате да отпечатате езиковите създатели, като използвате предишния ни код, това няма да работи. За да прочетете пространства от имена на елементи, трябва да използвате един от следните подходи.

Първият подход е да използвате имената на URI директно в кода, когато се позовавате на пространството от имена на елемента. Следният пример показва как се прави това:

$dc = $languages ​​​​-> lang [ 1 ] -> деца( "http://purl.org/dc/elements/1.1/") ;
ехо $dc -> създател;

Метод деца()взема пространство от имена и връща дъщерни елементи, които започват с префикс. Необходими са два аргумента, първият е XML пространството от имена, а вторият е незадължителен аргумент, който е по подразбиране невярно. Ако вторият аргумент е зададен на TRUE, пространството от имена ще се третира като префикс. Ако е FALSE, тогава пространството от имена ще се третира като пространство от имена на URL.

Вторият подход е да се прочетат URI имената от документа и да се използват при препратка към пространството от имена на елемента. Това всъщност е най-добрият начин за достъп до елементи, защото не е необходимо да сте твърдо кодирани в URI.

$namespaces = $languages ​​​​-> getNamespaces (true) ;
$dc = $languages ​​​​-> lang [ 1 ] -> деца ($namespaces [ "dc" ] );

ехо $dc -> създател;

Метод GetNamespaces()връща масив от имена на префикси и свързаните с тях URI. Необходим е допълнителен параметър, който е по подразбиране невярно. Ако го инсталирате като вярно, тогава този метод ще върне имената, използвани в родителски и дъщерни възли. В противен случай той намира пространства от имена, използвани само в родителския възел.

Сега можете да преминете през списъка с езици по следния начин:

$languages ​​​​= simplexml_load_file ("languages.xml" ) ;
$ns = $languages ​​​​-> getNamespaces (true) ;

foreach ($languages ​​​​-> lang като $lang ) (
$dc = $lang -> деца ($ns [ "dc" ] );
printf (
"

%s се появи в %d и беше създаден от %s.

" ,
$lang["име"],
$lang -> се появи,
$dc -> създател
) ;
}

Казус от практиката – Анализ на видеоканал в YouTube

Нека да разгледаме пример, който получава RSS емисия от YouTube канал и показва връзки към всички видеоклипове от него. За да направите това, моля свържете се със следния адрес:

http://gdata.youtube.com/feeds/api/users/xxx/uploads

URL адресът връща списък с най-новите видеоклипове от дадения канал в XML формат. Ще анализираме XML и ще получим следната информация за всеки видеоклип:

  • Линк към видео
  • Миниатюрен
  • Име

Ще започнем с търсене и зареждане на XML:

$channel = "Име на канал" ;
$url = "http://gdata.youtube.com/feeds/api/users/". $канал. "/качвания" ;
$xml = file_get_contents ($url) ;

$feed = simplexml_load_string ($xml) ;
$ns = $feed -> getNameSpaces (истина);

Ако погледнете XML емисията, можете да видите, че там има няколко елемента. образувание, всеки от които съхранява подробна информация за конкретно видео от канала. Но ние използваме само миниатюри на изображения, адрес и заглавие на видеоклипа. Тези три елемента са деца на елемента група, което от своя страна е дете на влизане:

>

>



Заглавие... >

>

>

Просто ще преминем през всички елементи влизане, и извлечете необходимата информация за всеки от тях. забележи, че играч, миниатюраи заглавиеса в пространството на имената на медиите. Следователно трябва да продължим както в предишния пример. Получаваме имената от документа и използваме пространството от имена, когато се позоваваме на елементите.

foreach ($feed -> запис като $entry) (
$group = $entry -> деца ($ns [ "media" ] );
$group = $group -> group ;
$thumbnail_attrs = $group -> миниатюра [ 1 ] -> атрибути ();
$image = $thumbnail_attrs [ "url" ] ;
$player = $group -> player -> attributes () ;
$link = $player["url"] ;
$title = $group -> title ;
printf ( "

" ,
$player, $image, $title);
}

Заключение

Сега, когато знаете как да използвате SimpleXMLза да анализирате XML данни, можете да подобрите уменията си, като анализирате различни XML канали с различни API. Но е важно да имате предвид, че SimpleXML чете целия DOM в паметта, така че ако анализирате голям набор от данни, може да ви свърши паметта. За да научите повече за SimpleXML, прочетете документацията.


Ако имате въпроси, моля, използвайте нашия

Имам работа с PHP библиотека на трета страна, която не мога да редактирам и работи добре вече почти година. Той използва simplexml_load_string, за да отговори от отдалечения сървър. Напоследък се задушава от големи отговори. Това е емисия с данни за обекти на недвижими имоти и също така форматът изглежда по следния начин:

sysid 1 2 3 4 5 6 252370080 Жилищен 0,160 № ADDR0 06051 252370081 Жилищен 0,440 Да ADDR0 06043 252370082 Жилищен 1.010 № ADDR0 06023 Още текст, разделен с разделители

Изтеглих примерен файл с отговори (около 22MB), там се озовах с моето отстраняване на грешки и здравия разум. И двата сървъра работят с PHP версия 5.3.8, но имайте предвид различните резултати. Почти съм сигурен, че и двата файла са еднакви (предполагам, че различните типове файлове, strlen и последните 50 знака могат да бъдат обяснени с нови редове на Windows, които имат допълнителен знак за връщане на каретка). Сценарий на теста:

съобщаване на грешка (-1); ini_set("показване_грешки", 1); $file = "error-example.xml"; $xml = file_get_contents($file); echo "размер на файла: "; var_dump(размер на файла($файл)); ехо "strlen: "; var_dump(strlen($xml)); echo "simplexml обект?"; var_dump(is_object(simplexml_load_string($xml))); echo "Последните 50 знака: "; var_dump(substr($xml, -50));

Изход локално в Windows:

Размер на файл: int(21893604) strlen: int(21893604) simplexml обект? bool(true) Последни 50 знака: string(50) "RD DR CT Watertown 203-555-5555 "

Изход на отдалечен UNIX сървър:

Размер на файла: int(21884093) strlen: int(21884093) simplexml обект? Предупреждение: simplexml_load_string(): Обект: ред 9511: грешка на анализатора: вътрешна грешка в /path/to/test.php на ред 19 Предупреждение: simplexml_load_string(): ПОВРЕМЕН ТАВАН ВЪВ ФОАЙЕ, ТУХЛА FP В FR, НОВ ПОДОВ В LR DR FR FOYER KITCHEN в /path/to/test.php на ред 19 Предупреждение: simplexml_load_string(): ^в /path/to/test.php на ред 19 Предупреждение: simplexml_load_string(): Обект: ред 9511: грешка на анализатора: Допълнително съдържание в края на документа в /path/to/test.php на ред 19 Предупреждение: simplexml_load_string(): ПОВРЕМЕН ТАВАН ВЪВ ФОАЙЕ, ТУХЛА FP В FR, НОВ ПОДОВ ВЪВ LR DR FR ФОАЙЕР КУХНЯ в /path/to/test.php на ред 19 Предупреждение: simplexml_load_string(): ^in /path/to/test.php на ред 19 bool(false) Последни 50 знака: string(50) "ORD DR CT Watertown 203-555-5555 "

Някои отговори на коментари и допълнителна информация:

    Самият XML изглежда валиден, доколкото мога да преценя (и той правиработа на моята система).

    magic_quotes_runtime определено е изключен.

    Работещият сървър е с libxml версия 2.7.7, а другият е с 2.7.6. Може ли наистина да има значение? Не можах да намеря регистъра на промените на libxml, но това изглежда малко вероятно.

    Това се случва само ако отговорът/файлът е над определен размер и грешката винаги възниква на следващия ред.

    Не срещам проблеми с паметта, тестовият скрипт се изпълнява незабавно.

Има разлики в PHP конфигурациите, които мога да публикувам, ако знам кои са подходящи. Някаква идея какъв може да е проблемът или знам нещо друго, което мога да проверя?

SimpleXMLElement->asXML

SimpleXMLElement->asXML -- Връща добре оформен XML документ

Описание

Смесен SimpleXMLElement->asXML()

Методът asXML генерира данни в XML версия 1.0.

Списък с параметри
име на файл
Ако е зададен, методът ще записва данни в посочения файл.
Върнати стойности
Ако е указано име на файл, методът ще запише XML данните в посочения файл. В противен случай методът ще върне XML данните като низ.
Забележки
Ако изходният документ посочи кодирането на XML документа в заглавките с помощта на параметъра за кодиране, тогава методът asXML ще върне XML документа в указаното кодиране. Промяната на кодирането на XML документ с помощта на разширението SIMPLEXML не е възможна.
Примери
Пример 1: Изходен XML

$низ =<<

текст
неща


код

XML

ехо $xml->asXML(); //текстнеща
...?>

Методът asXML може да работи и с Xpath:

Пример 2: Използване на метода asXML() с Xpath

// Продължение на примера по-горе.
/* Търсене */
$резултат = $xml->xpath("/a/b/c");
докато (списък (, $ възел) = всеки ($ резултат)) (
echo $node->asXML(); // тексти неща
}
?>

SimpleXMLElement->атрибути

SimpleXMLElement->attributes -- Връща атрибутите на елемента.

Описание

SimpleXMLElement simplexml_element->attributes()

Тази функция връща имената и стойностите на атрибутите на избрания xml елемент. Забележка: SimpleXML има правило за добавяне на итеративни свойства към повечето методи. Те не могат да бъдат проверени с помощта на var_dump() или друг анализатор на обекти.

Пример 1: Интерпретиране на XML низ

$низ =<<
[имейл защитен]

XML
$xml = simplexml_load_string($string);
foreach($xml->users->attributes() като $a => $b) (
ехо $a,"="",$b,"\"\n";
}
?>

Този пример ще изведе:

Име="Евген"
възраст = "27

SimpleXMLElement->children

SimpleXMLElement->children -- Връща дъщерните елементи за дадения елемент

Описание

SimpleXMLElement simplexml_element->children()

Този метод намира дъщерните елементи за дадения елемент.

Забележка: SimpleXML има правило за добавяне на итеративни свойства към повечето методи. Те не могат да бъдат проверени с помощта на var_dump() или друг анализатор на обекти.

Пример 1: Използване на метода children().

$xml = simplexml_load_string(
"










");
ехо "

";
?>

Този пример ще изведе:

php-help.ru
links.php-help.ru
forum.php-help.ru
server.php-spravka.ruyandex.ru
money.yandex.ru
map.yandex.ru
market.yandex.ru

SimpleXMLElement->xpath

SimpleXMLElement->xpath -- Извършва Xpath заявка върху XML данни

Описание

Масив SimpleXMLElement->xpath (път на низ)

Методът xpath търси дъщерните елементи на SimpleXML елемента, чийто път е посочен в параметъра path. Методът връща масив от обекти SimpleXMLElement.

Пример 1. Xpath

$низ =<<

текст
неща


код

обикновена



XML
$xml = simplexml_load_string($string);
/* Търсене по */
$резултат = $xml->xpath("/a/b/c");
foreach ($result като $node) (
ехо "/a/b/c: ". $възел. "
";
}
/* Относителните пътища също работят... */
$резултат = $xml->xpath("b/c");
foreach ($result като $node) (
ехо "b/c: ". $възел. "
";
}
?>

Този скрипт ще изведе:

/a/b/c: текст
/a/b/c:нещаb/c:текстb/c:неща

Двата резултата са еднакви в този случай.

simplexml_import_dom (PHP 5)

simplexml_import_dom -- Връща SimpleXMLElement обект, създаден от DOM обект.

Описание

SimpleXMLElement simplexml_import_dom(DOMNode възел[, низ клас_име])

Тази функция взема DOM обект и създава SimpleXML обект въз основа на него.

Този нов обект може да се използва като нормален SimpleXML обект.

Ако възникнат грешки по време на създаването на обект, методът ще върне false.

Пример 1 Импортирайте DOM

$dom = нов domDocument;
$dom->loadXML(" php-spravka.ru");
ако (!$dom) (
echo "Грешка при анализиране на документ!";
изход;
}
$s = simplexml_import_dom($dom);
echo $s->site->url; // php-help.ru
?>

simplexml_load_file (PHP 5)

simplexml_load_file -- Интерпретира XML файл в обект

Описание

Object simplexml_load_file (низ име на файл [, низ име на клас [, int опции]])

Тази функция интерпретира името на файла с добре оформени XML данни в обект SimpleXMLElement. Ако има грешки в XML данните, функцията ще върне FALSE.

Можете да използвате незадължителния параметър class_name във функцията simplexml_load_file(), за да накарате функцията да върне обект от посочения клас. В този случай класът трябва да бъде разширение на класа SimpleXMLElement.

От PHP 5.1.0 и Libxml 2.6.0 можете да използвате незадължителния параметър за опции, чиято спецификация е описана в допълнителни параметри на Libxml.

Забележка: Libxml 2 преобразува URL адреса в правилната форма. Тези. ако искате да зададете a на b&c в URL низа, не е нужно да правите:

Simplexml_load_file(rawurlencode("http://example.com/?a=" . urlencode("b&c"))).

От PHP 5.1.0 това се прави автоматично.

Пример 1: Интерпретиране на XML документ

// Файлът test.xml съдържа XML документ с основен елемент
// и вложен заглавен елемент //title.if (file_exists("test.xml")) (
$xml = simplexml_load_file("test.xml");

Var_dump($xml);
) иначе (
exit("Грешка при отваряне на test.xml.");
}
?>
Този пример ще изведе следното: SimpleXMLElement Object(
=> Тестова заглавка
...
)

В този пример можете да се обърнете към заглавния елемент, както следва: $xml->title.

simplexml_load_string(PHP 5)

simplexml_load_string -- Интерпретира XML низ в обект

Описание

Object simplexml_load_string(данни за низ [, име на клас_низ[, int опции]])

Тази функция взема „правилния“ XML документ в низа с данни и връща обект от класа SimpleXMLElement, който има свойства, равни на съдържанието на xml документа. Ако XML документът има грешки, функцията ще върне FALSE.

Можете да използвате незадължителния параметър class_name, за да накарате функцията simplexml_load_string() да върне обект от дадения клас. Този клас трябва да разшири класа SimpleXMLElement.

Започвайки с PHP 5.1.0 и Libxml 2.6.0, можете също да използвате параметъра по избор, чието съдържание е дефинирано в допълнителните параметри на Libxml.

Пример 1: Трансформиране на XML низ

$низ =<<

четиридесет какво?
Джо
Джейн





XML
$xml = simplexml_load_string($string);
var_dump($xml);
?>
Този пример ще изведе: SimpleXMLElement Object(
=> Четиридесет Какво?
=> Джо
=> Джейн
=>
Знам, че това е отговорът - но какъв е въпросът?
)

В този пример можете също да използвате конструкциите $xml->body и т.н.

SimpleXML е доста прост и в същото време доста мощен начин за обработка на xml данни. Същността на simpleXML е, че целият XML код се преобразува в PHP обект, което улеснява работата с него. Когато работите с simpleXML, всички данни трябва да са в UTF-8 кодиране.

Най-често преобразуването в PHP обект се извършва с помощта на функцията simplexml_load_file, по-долу са дадени примери за работа с него. Освен това можете да използвате функцията simplexml_load_string,създаване на PHP обект от XML низ

Нека първо създадем xml файл

В следващия пример ще бъде показана само цената на втората кола.

За показване на целия xml код наведнъж или на един възел се използва методът asXML().

simpleXML също поддържа адресиране с помощта на езика XPath. Следващият пример ще избере всички възли "година" и ще върне масив от тях.

Замяната на стойностите на елемента се извършва чрез просто присвояване на стойност

Когато подменяте възли, които имат дъщерни възли, трябва да се внимава, тъй като всички дъщерни възли ще бъдат премахнати.

В предишните два примера xml данните в паметта бяха променени, но не бяха записани на диска. За да презапишете данни във файл, използвайте функцията file_put_contents()

Също така е възможно да се интегрират simpleXML и Dom с помощта на функцията Simplexml_import_dom().

Този пример ще покаже как да получите стойността на атрибутите на елемента.