PHP:如何遍历XML寻找节点?



我正在尝试遍历XML以查找特定节点,然后修改其值。我想找到<identifier_value>我该怎么做?下面的 xml 将是一个字符串。

<?xml version="1.0"?>
<?xml-stylesheet href="catalog.xsl" type="text/xsl"?>
<!DOCTYPE catalog SYSTEM "catalog.dtd">
<catalog>
<product description="Cardigan Sweater" product_image="cardigan.jpg">
<catalog_item gender="Men's">
<item_number>QWZ5671</item_number>
<price>39.95</price>
<size description="Medium">
<color_swatch image="red_cardigan.jpg">Red</color_swatch>
<color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>
</size>
<size description="Large">
<color_swatch image="red_cardigan.jpg">Red</color_swatch>
<color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>
</size>
</catalog_item>
<catalog_item gender="Women's">
<item_number>RRX9856</item_number>
<price>42.50</price>
<size description="Small">
<color_swatch image="red_cardigan.jpg">Red</color_swatch>
<color_swatch image="navy_cardigan.jpg">Navy</color_swatch>
<color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>
</size>
<size description="Medium">
<color_swatch image="red_cardigan.jpg">Red</color_swatch>
<color_swatch image="navy_cardigan.jpg">Navy</color_swatch>
<color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>
<color_swatch image="black_cardigan.jpg">Black</color_swatch>
<identifiers>
<identifier>
<identifier_type>Test</identifier_type>
<identifier_value>000000001</identifier_value>
</identifier>
</identifiers>
</size>
<size description="Large">
<color_swatch image="navy_cardigan.jpg">Navy</color_swatch>
<color_swatch image="black_cardigan.jpg">Black</color_swatch>
</size>
<size description="Extra Large">
<color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>
<color_swatch image="black_cardigan.jpg">Black</color_swatch>
</size>
</catalog_item>
</product>
</catalog>

PHP 有几个用于处理 XML 的插件。 我会从其中之一开始。 一种可能是SimpleXMLElement::xpath方法。

从 https://www.php.net/manual/en/simplexmlelement.xpath.php

$xml = new SimpleXMLElement($xmlstring);
$result = $xml->xpath('//identifier_value[text()="value_to_find"]');
// do something with $result, perhaps modifying the value or formatting etc.

如果要将整个目录(甚至其中的一部分(呈现到网页,则可能需要考虑使用 xslt 模板,这样就不必手动分析 XML。

PHP DOM 扩展支持完整的 Xpath 1.0 表达式。

$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMxpath($document);

// fetch and modify identifier_value node 
$expression = '(//catalog_item//identifiers/identifier/identifier_value[.="000000001"])[1]';
foreach ($xpath->evaluate($expression) as $identifierValueNode) {
$identifierValueNode->textContent = '000000042';
// dump to validate
var_dump($document->saveXML($identifierValueNode));
}

输出:

string(46) "<identifier_value>000000042</identifier_value>"

DOMXpath::evaluate()不仅可以返回节点列表,还可以返回标量值:

$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMxpath($document);
// get the first catalog item with the specified identifier
$expression = '(//catalog_item[.//identifiers/identifier/identifier_value="000000001"])[1]';
foreach ($xpath->evaluate($expression) as $itemNode) {
// read some scalar values 
var_dump(
$xpath->evaluate('string(item_number)', $itemNode),
$xpath->evaluate('number(price)', $itemNode)
);
}

输出:

string(7) "RRX9856"
float(42.5)

最新更新