【发布时间】:2014-02-04 07:13:42
【问题描述】:
我有一个附加了默认命名空间的 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]');
我必须register the namespace,给它分配一个前缀,然后在我的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);
但这是在回避问题。
【问题讨论】:
-
“从长远来看,添加前缀将无法管理”是什么意思?这是为什么呢?
-
@JLRishe 我试图尽可能简化问题。 XPath 当前位于 XLS 中。我们最终可能会自动化该过程,因此系统将读取 XML 文件目录 XLS,然后注入所有数据映射。我发现通过代码向 XPath 添加前缀很容易出错。
-
能否修改用于生成 XLS 的过程以使 XPath 包含前缀?
-
@JLRishe 再次简化。 XLS 将来自第三方(来自第四方的输入),并且 XPath 已经在他们的系统中。我没有看到该过程的任何部分发生变化,所以我的问题确实与 SimpleXML 和 XPath 如何与默认命名空间一起使用有关。
标签: php xml xpath namespaces simplexml