【问题标题】:Find node via xpath in SimpleXML在 SimpleXML 中通过 xpath 查找节点
【发布时间】:2019-02-24 13:53:33
【问题描述】:

试图在如下所示的 XML 文件中查找特定节点:

<?xml version="1.0" encoding="utf-8"?>
<disqus xmlns="http://disqus.com" xmlns:dsq="http://disqus.com/disqus-internals"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://disqus.com/api/schemas/1.0/disqus.xsd http://disqus.com/api/schemas/1.0/disqus-internals.xsd">
    <post dsq:id="2248389859">
        <id/>
        <message><![CDATA[<p>Message</p>]]></message>
        <createdAt>2015-09-11T17:08:10Z</createdAt>
        <isDeleted>false</isDeleted>
        <isSpam>false</isSpam>
        <author>
            <name>author</name>
            <isAnonymous>false</isAnonymous>
            <username>author</username>
        </author>
        <thread dsq:id="3828540236"/>
        <parent dsq:id="2246284031"/>
    </post>
</disqus>

我想通过 SimpleXML#xpath 方法找到post,更具体地说是通过thread dsq:id 属性。但我什至找不到线程本身

$xml = simplexml_load_file("file.xml")
var_dump($xml->xpath('/disqus');

这会打印一个空数组 - 但为什么呢?

【问题讨论】:

    标签: php


    【解决方案1】:

    我对正确的术语感到生疏,但我认为您的查询不起作用,因为您的元素正在声明默认命名空间。如果您使用明确的名称注册它并使用它来查询它似乎可以工作:。

    $xml->registerXPathNamespace( 'disqus', 'http://disqus.com' );
    
    $disqus = $xml->xpath( '/disqus:disqus' );
    $post   = $xml->xpath( '//disqus:post[disqus:thread/@dsq:id=3828540236]' );
    

    【讨论】:

      猜你喜欢
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多