Я пытаюсь понять, как захватить и напечатать конкретный IDValue
в приведенном ниже коде, но номер и порядок ProductIdentifier
узлы варьируются в зависимости от Product
, поэтому я не всегда могу получить правильное значение с помощью:
<?php print $productXML[0]->ProductIdentifier[2]->IDValue; ?>
Есть ли способ сделать что-то вроде: «Если ProductIDType
это 03, затем распечатать IDValue
этого дочернего узла «?
<Product>
<RecordReference>PublishingGroup</RecordReference>
<NotificationType>03</NotificationType>
<RecordSourceType>01</RecordSourceType>
<RecordSourceName>Publishing Group</RecordSourceName>
<ProductIdentifier>
<ProductIDType>01</ProductIDType>
<IDTypeName>ID</IDTypeName>
<IDValue>28831</IDValue>
</ProductIdentifier>
<ProductIdentifier>
<ProductIDType>02</ProductIDType>
<IDValue>0163668869</IDValue>
</ProductIdentifier>
<ProductIdentifier>
<ProductIDType>03</ProductIDType>
<IDValue>9180763668860</IDValue>
</ProductIdentifier>
<ProductIdentifier>
<ProductIDType>15</ProductIDType>
<IDValue>9180763668860</IDValue>
</ProductIdentifier>
ОБНОВИТЬ:
Я попытался использовать xpath, как это было предложено в очень полезных комментариях ниже, но он просто возвращал «Array» при попытке печати через php. Я попробовал несколько способов исправить это, принимая во внимание другие вопросы здесь, на SO, а также на документах W3C и в других местах, но безуспешно.
Вот что я в итоге и сделал:
<?php
foreach($productXML[0]->ProductIdentifier as $value) {
if($value->ProductIDType=='03')
{
print ($value->IDValue);
}
}
?>
Не самое элегантное из решений, но оно выдает правильное значение сейчас.
Прежде всего, есть операция по извлечению узла (-value) из документа. Поскольку весь документ является своего рода деревом узлов, выполнение запроса xpath очень помогает в достижении цели, особенно если у вас есть условие для получения определенного узла (-value).
Однако использование Xpath также вводит новый язык. Итак, есть xpath-часть, а также PHP-часть. Давайте сначала сделаем это Xpath (как с псевдокодом). Ты хочешь:
Есть ли способ сделать что-то вроде: «Если
ProductIDType
это 03, затем распечататьIDValue
этого дочернего узла «?
Как и на любой вопрос программирования, который требует возможностей, есть ответ «наверняка да»;) — вот оно:
//*[ProductIDType = "03"]/IDValue
Это чистый Xpath и выглядит следующим образом: Дайте мне элемент с именем IDValue
это дочерний узел любого элемента (*
подстановочный знак для любого имени) во всем документе (//
корень или глубже), который имеет другой дочерний узел с именем ProductIDType
со строковым значением03
«(так называемый предикат).
В вашем случае вы уже знаете имя родительского элемента, поэтому вместо *
Вы можете использовать имя элемента напрямую (ProductIdentifier
). И вы также можете сказать, как называется родительский элемент (Product
), так что вы также можете использовать его (это делает вещи более конкретными, поэтому вы показываете, что вы точно поняли, что ищете):
//Product/ProductIdentifier[ProductIDType = "03"]/IDValue
Много слов для более или менее простого псевдокода, который сам по себе не работает. Но это стоит понять, так как это правильное выражение Xpath.
Теперь вернемся к PHP и SimpleXML. Так как SimpleXML может только запрос Выражения Xpath, он всегда возвращает массив (а не одно значение). Но это не проблема. Если вы ищете одно значение, это первый элемент (значение) массива. Который доступен [0]
на нулевых индексированных массивах (которые являются вернулся SimpleXMLElement::xpath()
если не было ошибки (или не было никакого элемента вообще)).
В случае вашего XML-фрагмента:
<?php
$buffer = <<<XML
<Product>
<RecordReference>PublishingGroup</RecordReference>
<NotificationType>03</NotificationType>
<RecordSourceType>01</RecordSourceType>
<RecordSourceName>Publishing Group</RecordSourceName>
<ProductIdentifier>
<ProductIDType>01</ProductIDType>
<IDTypeName>ID</IDTypeName>
<IDValue>28831</IDValue>
</ProductIdentifier>
<ProductIdentifier>
<ProductIDType>02</ProductIDType>
<IDValue>0163668869</IDValue>
</ProductIdentifier>
<ProductIdentifier>
<ProductIDType>03</ProductIDType>
<IDValue>9180763668860</IDValue>
</ProductIdentifier>
<ProductIdentifier>
<ProductIDType>15</ProductIDType>
<IDValue>9180763668860</IDValue>
</ProductIdentifier>
</Product>
XML;
Там является результат для запроса xpath, который обсуждался до сих пор:
$xml = simplexml_load_string($buffer);
$first = $xml->xpath('//Product/ProductIdentifier[ProductIDType = "03"]/IDValue')[0];
echo $first, "\n"; # prints: "9180763668860\n"
Это тоже пример (увидеть его полностью как онлайн-демо).
Так что до этой самой строчки это должно показать всю картину, если я не слишком тороплюсь в конце. Пожалуйста, оставьте отзыв, если он вам помог и чего не хватает с вашей точки зрения.
Других решений пока нет …