我有一个带有默认命名空间的XML文档,例如:
<foo xmlns="http://www.example.com/ns/1.0">
...
</foo>
实际上,这是符合复杂模式的复杂XML文档。我的工作是从中解析出一些数据。为了帮助我,我有一个XPath电子表格。XPath嵌套非常深,例如:
level1/level2/level3[@foo="bar"]/level4[@foo="bar"]/level5/level6[2]
生成XPath的人是模式专家,因此我假设无法简化它或使用对象遍历快捷方式。
我正在使用SimpleXML解析所有内容。我的问题与默认命名空间的处理方式有关。
由于根元素上有默认命名空间,所以我不能只是这样做:
$xml = simplexml_load_file($somepath);
$node = $xml->xpath('level1/level2/level3[@foo="bar"]/level4[@foo="bar"]/level5/level6[2]');
我需要注册命名空间,将其分配给一个前缀,然后在我的XPath中使用该前缀,例如。
$xml = simplexml_load_file($somepath);
$xml->registerXPathNamespace('myns', 'http://www.example.com/ns/1.0');
$node = $xml->xpath('myns:level1/myns:level2/myns:level3[@foo="bar"]/myns:level4[@foo="bar"]/myns:level5/myns:level6[2]');
长期来看,添加前缀是不可管理的。
是否有一种适当的方法处理默认命名空间,而无需在XPath中使用前缀?
使用空前缀不起作用($xml->registerXPathNamespace('', 'http://www.example.com/ns/1.0');
)。我可以将默认命名空间字符串化,例如
$xml = file_get_contents($somepath);
$xml = str_replace('xmlns="http://www.example.com/ns/1.0"', '', $xml);
$xml = simplexml_load_string($xml);
但这是绕开问题。