使用php从xml文件中获取嵌套标记值
我有一个特殊格式的xml文件,如何从中获取特定的标记值,例如,如果我想获取每个dict标记的旋转值。正如您所看到的,每个dict的旋转值都嵌套在嵌套在dist标记中的数组标记中。请为我指出正确的方向使用php从xml文件中获取嵌套标记值,php,xml,Php,Xml,我有一个特殊格式的xml文件,如何从中获取特定的标记值,例如,如果我想获取每个dict标记的旋转值。正如您所看到的,每个dict的旋转值都嵌套在嵌套在dist标记中的数组标记中。请为我指出正确的方向 <?xml version="1.0" encoding="UTF-8"?> <pu version="1.0"> <dict> <key>ID</key> <string>C0AC8773-CEE6-4A1
<?xml version="1.0" encoding="UTF-8"?>
<pu version="1.0">
<dict>
<key>ID</key>
<string>C0AC8773-CEE6-4A12-9C69-320A1BDB7255</string>
<key>Items</key>
<array>
<dict>
<key>opacity</key>
<real>1</real>
<key>Thickness</key>
<real>0</real>
<key>repeat</key>
<false/>
<key>rotation</key>
<real>90</real>
</dict>
<dict>
<key>opacity</key>
<real>1</real>
<key>Thickness</key>
<real>0</real>
<key>repeat</key>
<false/>
<key>rotation</key>
<real>180</real>
</dict>
<dict>
<key>opacity</key>
<real>1</real>
<key>Thickness</key>
<real>0</real>
<key>repeat</key>
<false/>
<key>rotation</key>
<real>270</real>
</dict>
</array>
</dict>
</pu>
这将打印数组标记内的所有标记,但我只需要旋转值将这些XML数据粘贴到文件上,比如说
yourxmlfile.XML
,然后使用simplexml\u load\u file()
解析XML数据。使用foreach
可以像这样循环
<?php
$xml = simplexml_load_file('yourxmlfile.xml');
foreach ($xml->dict->array->dict as $tag)
{
if($tag[0]->key[3]=="rotation")
{
echo $tag[0]->real[2]."<br>";
}
}
如另一个答案所述,
键
/(值)
“配对”是奇数。但是,您也可以使用xPath实现这一点:
$xml = new SimpleXMLElement($string);
$result = $xml->xpath("dict/array/dict/key[text()='rotation']/following-sibling::real");
while(list( , $node) = each($result)) {
echo 'dict/array/dict/rotation: ',$node,"\n";
}
其中:
dict/array/dict/rotation: 90
dict/array/dict/rotation: 180
dict/array/dict/rotation: 270
您可以通过XPath表达式来完成:
$dom = new DOMDocument;
$dom->loadXML($xml);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query("//*[text()='rotation']/following-sibling::real/text()");
foreach ($nodes as $node) {
echo $node->nodeValue, PHP_EOL;
}
XPath表达式的意思是:查找所有
标记,后跟具有节点值旋转的任何标记,并获取它们的节点值。XPath表达式允许您对标记进行更多控制。可以根据需要调整表达式
输出:
90
180
270
没错,而且对于给定的任务,xml的格式很奇怪。你可能会认为他们会有类似于值的东西,而不是让值成为下一个兄弟姐妹。@Victory,确切地说,他们没有类似的属性结构,所以可能的方法是这样的。
$dom = new DOMDocument;
$dom->loadXML($xml);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query("//*[text()='rotation']/following-sibling::real/text()");
foreach ($nodes as $node) {
echo $node->nodeValue, PHP_EOL;
}
90
180
270