PHP XML-查找到已知值的路径

PHP XML-查找到已知值的路径,php,xml,parsing,xpath,xml-parsing,Php,Xml,Parsing,Xpath,Xml Parsing,下面是一个XML位: [11] => SimpleXMLElement Object ( [@attributes] => Array ( [id] => 46e8f57e67d

下面是一个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";

}

此字符串是否始终位于
@id
属性中?然后,有效且不同的路径总是
/*[@id='46e8f57e67db48b29d84dda77cf0ef51']

要构造到给定节点的路径,请使用
$node->getNodePath()
,它将返回当前节点的XPath表达式。也要考虑到

对于SimpleXML,您必须手工完成所有操作。如果您需要支持属性和其他路径,则必须添加此项,此代码仅支持元素节点

$results = $xml->xpath("/highways/route[66]");

foreach($results as $result) {
    $path = "";
    while (true) {
        // Is there an @id attribute? Shorten the path.
        if ($id = $result['id']) {
            $path = "//".$result->getName()."[@id='".(string) $id."']".$path;
            break;
        }
        // Determine preceding and following elements, build a position predicate from it.
        $preceding = $result->xpath("preceding-sibling::".$result->getName());
        $following = $result->xpath("following-sibling::".$result->getName());
        $predicate = (count($preceding) + count($following)) > 0 ? "[".(count($preceding)+1)."]" : "";
        $path = "/".$result->getName().$predicate.$path;
        // Is there a parent node? Then go on.
        $result = $result->xpath("parent::*");
        if (count($result) > 0) $result = $result[0];
        else break;
    }
    echo $path."\n";
}

此字符串是否始终位于
@id
属性中?然后,有效且不同的路径总是
/*[@id='46e8f57e67db48b29d84dda77cf0ef51']

要构造到给定节点的路径,请使用
$node->getNodePath()
,它将返回当前节点的XPath表达式。也要考虑到

对于SimpleXML,您必须手工完成所有操作。如果您需要支持属性和其他路径,则必须添加此项,此代码仅支持元素节点

$results = $xml->xpath("/highways/route[66]");

foreach($results as $result) {
    $path = "";
    while (true) {
        // Is there an @id attribute? Shorten the path.
        if ($id = $result['id']) {
            $path = "//".$result->getName()."[@id='".(string) $id."']".$path;
            break;
        }
        // Determine preceding and following elements, build a position predicate from it.
        $preceding = $result->xpath("preceding-sibling::".$result->getName());
        $following = $result->xpath("following-sibling::".$result->getName());
        $predicate = (count($preceding) + count($following)) > 0 ? "[".(count($preceding)+1)."]" : "";
        $path = "/".$result->getName().$predicate.$path;
        // Is there a parent node? Then go on.
        $result = $result->xpath("parent::*");
        if (count($result) > 0) $result = $result[0];
        else break;
    }
    echo $path."\n";
}

PHPs DOMNode对象有一个函数:
DOMNode::getNodePath()

SimpleXML是DOM的包装器,下面是一个函数,允许您获取SimpleXML元素的DOMNode:
DOM\u import\u 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());
}

PHPs DOMNode对象有一个函数:
DOMNode::getNodePath()

SimpleXML是DOM的包装器,下面是一个函数,允许您获取SimpleXML元素的DOMNode:
DOM\u import\u 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());
}

谢谢,这是一个非常有用的回答@JensErat。您能推荐一种使用SimpleXML扩展构建路径的方法吗?非常感谢!据我所知,在DOMXPath上使用SimpleXML有一个缺点。谢谢,这是一个非常有用的答案@JensErat。您能推荐一种使用SimpleXML扩展构建路径的方法吗?非常感谢!据我所知,在DOMXPath.Thaks@ThW上使用SimpleXML有一个缺点,这是一个更简单的答案。我认为使用SimpleXML会更简单,但并非所有情况下都如此。很好,这是一个更简洁的答案,但发现值路径的搜索标记丢失了。请您将其添加到完整答案中,好吗?它始终是一个id属性还是另一个元素的内容?它始终是id属性。此答案被低估了!这可能节省了我几小时甚至几天的生命。Thaks@ThW,一个更简单的答案。我认为使用SimpleXML会更简单,但并非所有情况下都如此。很好,这是一个更简洁的答案,但发现值路径的搜索标记丢失了。请您将其添加到完整答案中,好吗?它始终是一个id属性还是另一个元素的内容?它始终是id属性。此答案被低估了!这可能节省了我几小时甚至几天的时间。
$dom = new DOMDocument();
$dom->loadXml('<node id="46e8f57e67db48b29d84dda77cf0ef51"/>');
$xpath = new DOMXpath($dom);

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