Вот код XML, с которым я работаю:
<inventory> <drink> <lemonade supplier="mother" id="1"> <title>Super Lemonade</title> <price>$2.50</price> <amount>20</amount> </lemonade> <lemonade supplier="mike" id="4"> <title>Lemonade Plus</title> <price>$3.00</price> <amount>20</amount> </lemonade> <pop supplier="store" id="2"> <title>Poppys</title> <price>$1.50</price> <amount>10</amount> </pop> </drink> </inventory>
Затем я написал простой код для работы с XPath:
<?php $xmldoc = new DOMDocument(); $xmldoc->load('sample.xml'); $xpathvar = new Domxpath($xmldoc); $queryResult = $xpathvar->query('//lemonade/price'); foreach($queryResult as $result){ echo $result->textContent; } ?>
Этот код работает хорошо, выводя все значения цены лимонада, как ожидалось.
Теперь мне нужен XPATH, чтобы получить TITLE и ПОСТАВЩИК всех предметов с количеством = 20.
Как мне это сделать ?
спасибо
Использование :
/*/*/*[amount = 20]/@supplier | /*/*/*[amount = 20]/title
Это позволяет выбрать :
Любой атрибут supplier
любого элемента, который является grand-child верхнего элемента XML-документа (то же самое, что и /inventory/drink/lemonade
, но мне нравится писать короткие выражения XPath), amount
которых имеет строковое значение, которое равно литой к числу 20.
Любой дочерний элемент дочернего элемента любого элемента, который является грандиозным элементом верхнего элемента XML-документа (то же, что и /inventory/drink/lemonade
, но мне нравится писать короткие выражения XPath), amount
ребенка имеет строковое значение, которое литой к числу 20.
Проверка на основе XSLT :
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:template match="node()|@*"> <xsl:for-each select= "/*/*/*[amount = 20]/@supplier | /*/*/*[amount = 20]/title"> <xsl:value-of select="."/> <xsl:text>
</xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet>
Когда это преобразование применяется к предоставленному XML-документу :
<inventory> <drink> <lemonade supplier="mother" id="1"> <title>Super Lemonade</title> <price>$2.50</price> <amount>20</amount> </lemonade> <lemonade supplier="mike" id="4"> <title>Lemonade Plus</title> <price>$3.00</price> <amount>20</amount> </lemonade> <pop supplier="store" id="2"> <title>Poppys</title> <price>$1.50</price> <amount>10</amount> </pop> </drink> </inventory>
он оценивает выражение XPath и копирует значения выбранных режимов в отдельных строках :
mother Super Lemonade mike Lemonade Plus
Обратите внимание :
Вашему обучению XPath можно очень помочь с помощью такого инструмента, как XPath Visualizer, который используется многими тысячами людей для изучения XPath.
В общем, вы хотите использовать прямые пути по //
search, потому что это быстрее:
/inventory/drink/lemonade[amount=20]/title
а также
/inventory/drink/lemonade[amount=20]/@supplier
Вы можете комбинировать оба запроса XPath с |
(UNION), который затем вернет четыре узла.
Программный доступ к атрибутам с DOM объясняется в:
Вы можете найти хороший учебник по XPath в