как перебирать xml с помощью php с разными узлами

#php #xml #wordpress

#php #xml #wordpress

Вопрос:

вот мой xml, я хочу перебрать propertyList и получить жилые и арендные узлы, может кто-нибудь помочь мне узнать, как я могу это сделать, также, когда я печатаю узел propertylist, он возвращает нулевой массив

 <propertyList>
<residential modTime="2020-11-10-11:35:06" status="current">
<agentID/>
<uniqueID>eagle_659872</uniqueID>
<authority value="exclusive"/>
<underOffer value="no"/>
<isHomeLandPackage value="no"/>
<listingAgent id="1">
  <name>Matt Luff</name>
</listingAgent>
<price display="yes">900000</price>
<priceView/>
<landDetails>
  <area unit="squareMeter"/>
  <frontage/>
  <depth side="left"/>
  <depth side="right"/>
  <depth side="rear"/>
 </landDetails>
 </residential>


<rental modTime="2020-11-09-12:56:01" status="current">
<agentID/>
<uniqueID>eagle_662855</uniqueID>
<listingAgent id="1">
  <name>Leasing Specialists </name>
</listingAgent>
<priceView>$430 per week</priceView>
<bond>1720</bond>
 <landDetails>
  <area unit="squareMeter"/>
  <frontage/>
  <depth side="left"/>
  <depth side="right"/>
  <depth side="rear"/>
 </landDetails>
 </rental>
 </propertyList>
  

Комментарии:

1. Что вы подразумеваете под «получить жилые и арендные узлы»? Каков именно ваш ожидаемый результат?

2. на самом деле я хочу запустить один цикл и получить дочерние узлы жилых и арендуемых дочерних узлов, прямо сейчас я использую 2 цикла, чтобы получить все дочерние узлы жилых и арендуемых. в этом приведенном выше xml я вставляю только некоторую часть .. там много узлов, названных жилыми и такими же, как аренда

3. я хотел бы запустить для каждого цикла в propertylist и получить все дочерние элементы внутри него, но, к сожалению, не знаю, почему proprtylist возвращает нулевой массив

4. Опять же, я не знаю, что означает «получить всех дочерних элементов» и т. Д. Каков именно ваш ожидаемый результат?

Ответ №1:

Используйте выражения Xpath. Это позволяет вам извлекать узлы и значения из DOM.

 $document = new DOMDocument();
$document->loadXML(getXML());
$xpath = new DOMXpath($document);

$expression = '/propertyList/residential|/propertyList/rental';
foreach ($xpath->evaluate($expression) as $property) {
    echo $property->localName, "n";
    echo 'ID: ', $xpath->evaluate('string(uniqueID)', $property);
    echo 'Price: ', $xpath->evaluate('string(priceView)', $property);
    echo "n";
}
  

Вывод:

 residential
ID: eagle_659872
Price: 

rental
ID: eagle_662855
Price: $430 per week
  

Выражение like /propertyList/residential вернет узлы, соответствующие этому пути к местоположению. | разделяет альтернативные выражения. Начало / привязывает выражение к корню документа.

$xpath->evaluate('string(uniqueID)', $property) вычисляет выражение string(uniqueID) с $property узлом в качестве контекста. Он содержит приведение строки, поэтому он вернет текстовое содержимое первого uniqueID дочернего элемента node.

Это только самые основные функции. Xpath допускает гораздо более сложные выражения с условиями.