php - PHP XML-找出已知值的路径

标签 php xml parsing xpath xml-parsing

这是XML位:

[11] => SimpleXMLElement Object
                                (
                                    [@attributes] => Array
                                        (
                                            [id] => 46e8f57e67db48b29d84dda77cf0ef51
                                            [label] => Publications
                                        )

                                    [section] => Array
                                        (
                                            [0] => SimpleXMLElement Object
                                                (
                                                    [@attributes] => Array
                                                        (
                                                            [id] => 9a34d6b273914f18b2273e8de7c48fd6
                                                            [label] => Journal Articles
                                                            [recordId] => 1a5a5710b0e0468e92f9a2ced92906e3
                                                        )


我知道值“ 46e8f57e67db48b29d84dda77cf0ef51”,但其位置在文件中有所不同。我可以使用XPath查找该值的路径吗?如果没有,可以使用什么?

最新的试用版无效:

$search = $xml->xpath("//text()=='047ec63e32fe450e943cb678339e8102'");

while(list( , $node) = each($search)) {

    echo '047ec63e32fe450e943cb678339e8102',$node,"\n";

}

最佳答案

PHP的DOMNode对象具有以下功能:DOMNode::getNodePath()

$xml = <<<'XML'
<root>
  <child key="1">
    <child key="2"/>
    <child key="3"/>
  </child>
</root>
XML;

$dom = new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXpath($dom);

$nodes = $xpath->evaluate('//child');

foreach ($nodes as $node) {
  var_dump($node->getNodePath());
}


输出:

string(11) "/root/child"
string(20) "/root/child/child[1]"
string(20) "/root/child/child[2]"


SimpleXML是DOM的包装器,这是一个允许您获取SimpleXMLElement的DOMNode的函数:dom_import_simplexml

$xml = <<<'XML'
<root>
  <child key="1">
    <child key="2"/>
    <child key="3"/>
  </child>
</root>
XML;

$structure = simplexml_load_string($xml);
$elements = $structure->xpath('//child');

foreach ($elements as $element) {
  $node = dom_import_simplexml($element);
  var_dump($node->getNodePath());
}


要通过其属性获取元素,可以使用xpath。

在文档中的任何位置使用元素百搭器选择所有节点:

//*

通过id属性过滤它们:

//*[@id = "46e8f57e67db48b29d84dda77cf0ef51"]

$dom = new DOMDocument();
$dom->loadXml('<node id="46e8f57e67db48b29d84dda77cf0ef51"/>');
$xpath = new DOMXpath($dom);

foreach ($xpath->evaluate('//*[@id = "46e8f57e67db48b29d84dda77cf0ef51"]') as $node) {
  var_dump(
    $node->getNodePath()
  );
}

关于php - PHP XML-找出已知值的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20928367/

相关文章:

c++ - 如何使用没有明确格式样式的 C++ 解析 CSV 文件

java - 如何拆分句子?

javascript - 从数组中设置 fullcalendar 中的事件

php - Laravel 过滤已经过滤的结果

php - 文史泰因 : MySQL + PHP

Android:TextInputLayout - 自定义提示、底线和错误消息的颜色

parsing - 选择正确的 ReadP 解析结果

php - 如何通过xpath从网站获取标题?

sql-server - 根据同级其他节点的值更新节点值 XML T-SQL

java - 处理 jaxb 中的频繁架构更改