代码之家  ›  专栏  ›  技术社区  ›  Dave Vogt

PHP simplexml:为什么xpath停止工作?

  •  12
  • Dave Vogt  · 技术社区  · 17 年前

    供应商稍微更改了XML头之后发生了一件奇怪的事情。我以前能够使用xpath阅读内容,但现在我甚至无法用xpath获得回复

    $xml->xpath('/');
    

    他们改变了这个。。。

    <?xml version="1.0" encoding="iso-8859-1"?>
    <!DOCTYPE NewsML SYSTEM "http://www.newsml.org/dl.php?fn=NewsML/1.2/specification/NewsML_1.2.dtd" [
    <!ENTITY % nitf SYSTEM "http://www.nitf.org/IPTC/NITF/3.4/specification/dtd/nitf-3-4.dtd">
    %nitf;
    ]>
    <NewsML>
    ...
    

    <?xml version="1.0" encoding="iso-8859-1"?>
    <NewsML
      xmlns="http://iptc.org/std/NewsML/2003-10-10/"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://iptc.org/std/NewsML/2003-10-10/ http://www.iptc.org/std/NewsML/1.2/specification/NewsML_1.2.xsd http://iptc.org/std/NITF/2006-10-18/   http://contentdienst.pressetext.com/misc/nitf-3-4.xsd"
    >
    ...
    
    1 回复  |  直到 17 年前
        1
  •  25
  •   Tomalak    11 年前

    这很可能是因为他们引入了默认名称空间( xmlns="http://iptc.org/std/NewsML/2003-10-10/" )在他们的文件中。简单地说,SimpleXML对默认名称空间的支持不是很好。

    $xml->registerXPathNamespace("n", "http://iptc.org/std/NewsML/2003-10-10/");
    $xml->xpath('/n:NewsML');
    

    "n:" 前缀 每一个 http://people.ischool.berkeley.edu/~felix/xml/php-and-xmlns.html .

    the spec :

    The registerXPathNamespace() function 为下一个XPath查询创建前缀/ns上下文。

    function simplexml_xpath_ns($element, $xpath, $xmlns)
    {
        foreach ($xmlns as $prefix_uri)
        {
            list($prefix, $uri) = explode("=", $prefix_uri, 2);
            $element->registerXPathNamespace($prefix, $uri);
        }
        return $element->xpath($xpath);
    }
    

    用法:

    $xmlns = ["n=http://iptc.org/std/NewsML/2003-10-10/"];
    $result = simplexml_xpath_ns($xml, '/n:NewsML', $xmlns);