使用php从xml文件中获取嵌套标记值

使用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文件,如何从中获取特定的标记值,例如,如果我想获取每个dict标记的旋转值。正如您所看到的,每个dict的旋转值都嵌套在嵌套在dist标记中的数组标记中。请为我指出正确的方向

<?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