2014-03-04 4 views
0

У меня есть код что-то вроде этого:Как остановить цикл в XML йот парсинга PHP

<?xml version="1.0" encoding="UTF-8"?> 
<Personlist xmlns="http://example.org"> 
    <Person> 
     <Name>Louis</Name> 
     <Address> 
      <StreetAddress>Somestreet</StreetAddress> 
      <PostalCode>00001</PostalCode> 
      <CountryName>Finland</CountryName> 
     </Address> 
    </Person> 
    <Person> 
     <Name>Rakshith</Name> 
     <Address> 
      <StreetAddress>Somestreet</StreetAddress> 
      <PostalCode>00001</PostalCode> 
      <CountryName>Finland</CountryName> 
     </Address> 
    </Person> 
    <Person> 
     <Name>Steve</Name> 
     <Address> 
      <StreetAddress>Someotherstreet</StreetAddress> 
      <PostalCode>43400</PostalCode> 
      <CountryName>Sweden</CountryName> 
     </Address> 
    </Person> 
</Personlist> 

Как остановить цикл, если имя «Rakshith» найдено в XML DOM разборе. И в простом XML-парсере мы можем напрямую обращаться к n-му элементу, например $ xml-> Person [0] -> Name. Но в XML dom нам нужно разбираться в foreach, пока я знаю. Есть ли такой способ, который бы соответствовал моим требованиям.

Заранее благодарен

+0

Я думаю, вам нужен синтаксический анализатор для этого ... –

+0

Спасибо за быстрый ответ @ eric.itzhak. Раньше я использовал simple_xml_parser(). Из-за неопределенных объектов, предложенных одним из экспертов на этом форуме, я переключился на xml dom. Теперь вы предлагаете мне саксовый парсер, теперь я немного смущен этими материалами, которые я должен выбрать. Я немного новичок в XML. Не могли бы вы помочь мне в этом, потому что в веб-службах XML, в которых мы зависим, всегда будут отсутствовать некоторые теги из одной детали в другую, что приводит к неопределенному виду объекта и прекращает выполнение. Какой лучший синтаксический анализатор XML обрабатывает это по вашему мнению? Спасибо –

+0

Я не эксперт сам, но, насколько я знаю, вы не можете остановить синтаксические анализаторы с вашим состоянием, поэтому саксофонические парсеры для ... вещь - это и «simple_xml_parser», и тот, который вы перенесли на являются синтаксическими анализаторами dom, где весь XML встроен в память перед использованием, в то время как сдержанный из парсеров саксов состоит в том, что он основан на событиях, где вы фактически не создаете его в памяти, а повторяете его, не знаете, какой из них лучше использовать для вас, но читайте о различиях: http://stackoverflow.com/questions/6828703/what-is-the-difference-between-sax-and-dom –

ответ

0

Если вы используете DOM. Вы можете использовать Xpath, чтобы выбрать только те узлы, которые необходимо выполнить итерацию:

$dom = new DOMDocument(); 
$dom->loadXml($xml); 
$xpath = new DOMXpath($dom); 
$xpath->registerNamespace('ns1', 'http://example.org'); 

$persons = $xpath->evaluate('/ns1:Personlist/ns1:Person[ns1:Name = "Rakshith"]'); 
foreach ($persons as $person) { 
    var_dump(
    $xpath->evaluate('string(ns1:Name)', $person), 
    $xpath->evaluate('string(ns1:Address/ns1:CountryName)', $person) 
); 
} 

Выход: https://eval.in/110336

string(8) "Rakshith" 
string(7) "Finland" 

Xpath является достаточно мощным. Вы используете выражение с условиями для описания списка узлов (это может быть список с одним узлом или пустой список). Если вы делаете что-то, что подразумевает скалярное значение, используется первый узел в списке.

Я, например, вы определяете пространство имен XML по умолчанию. Здесь нет пространства имен XML по умолчанию в xpath, вы регистрируете свой собственный префикс и используете его. В примере используется «ns1».

выражение

Xpath выбирает элемент Personlist оригиналодержателя

/ns1:Personlist

то его Person дочерние элементы:

/ns1:Personlist/ns1:Person

ограничивает этот список узлов с ребенком Name с величиной "Rakshith"

/ns1:Personlist/ns1:Person[ns1:Name = "Rakshith"]

Это всегда будет возвращать список (пустой, если ничего не найдено), чтобы можно было повторить этот список без дальнейшей проверки.

Внутри выражения цикла используются контекст, предоставленный в качестве второго аргумента для оценки. Функция string() выводит список результатов в строковое значение.