如何用命名空间解析出 XML 文件?

How parsing out XML file with namespaces?

我知道以前曾 post 提出过类似的问题,但我无法解析这个带有命名空间的 XML 文件。

这是它的 link,因为它太大了 post:https://tsdrapi.uspto.gov/ts/cd/casestatus/sn86553893/info.xml

我试过使用 simplexml_load_file,但这并没有创建 xml 对象。然后我发现了类似的问题并尝试这样的事情,前提是我已经下载了名为 86553893.xml

的文件

这是我的 php 代码:

$xml= new SimpleXMLElement("86553893.xml");
                            foreach($xml->xpath('//com:ApplicationNumber') as $event) {
                                var_export($event->xpath('com:ApplicationNumberText'));
                        }

您需要将第 3 个参数传递为 true:

<?php

$xml= new SimpleXMLElement("info.xml", NULL, true);
                            foreach($xml->xpath('//com:ApplicationNumber') as $event) {
                                    var_export($event->xpath('com:ApplicationNumberText'));

}

输出:

array (
  0 => 
  SimpleXMLElement::__set_state(array(
  )),
)

您可以阅读更多关于 SimpleXMLElement 的信息:

http://php.net/manual/en/simplexmlelement.construct.php

您必须在每个要使用的元素上注册名称空间:

$xml= new SimpleXMLElement("86553893.xml");
$xml->registerXpathNamespace('com', 'http://www.wipo.int/standards/XMLSchema/Common/1');
foreach ($xml->xpath('//com:ApplicationNumber') as $event) {
  $event->registerXpathNamespace(
    'com', 'http://www.wipo.int/standards/XMLSchema/Common/1'
  );                         
  var_export($event->xpath('com:ApplicationNumberText'));
}

这在 DOM 中有所不同,您使用 DOMXPath 实例,因此它只是一个对象,您只需注册一次命名空间。

$dom = new DOMDocument();
$dom->load("86553893.xml");
$xpath = new DOMXpath($dom);
$xpath->registerNamespace('com', 'http://www.wipo.int/standards/XMLSchema/Common/1');

foreach ($xpath->evaluate('//com:ApplicationNumber') as $event) {
  var_export($xpath->evaluate('string(com:ApplicationNumberText)', $event));
}