0

这是一个愚蠢的 XPATH 问题。代码是 PL/SQL 但没关系。

lx_a := XMLTYPE('<rfs-graph><graphml>foo</graphml><rfs-graph>');
lx_b := lx_a.extract('/rfs-graph/graphml[1]');
dbms_output.put_line(lx_b.getStringVal());

运行时,结果是

<graphml>foo</graphml>

但是当这段代码运行时:

lx_a := XMLTYPE('<rfs-graph><graphml xmlns="abc">foo</graphml></rfs-graph>');
lx_b := lx_a.extract('/rfs-graph/graphml[1]');
dbms_output.put_line(lx_b.getStringVal());

它失败了,因为 lx_b 为空。

唯一的区别是 graphml 元素有一个属性。

无论它是否具有属性,如何选择 graphml 元素?

4

2 回答 2

2

实际上它没有属性,而是 xml 命名空间声明。因此,您的 xpath 正在寻找来自 null 命名空间的 graphml 元素,但只有来自“abc”命名空间的 graphml 元素。因此它什么也找不到。

您可以使用例如以下 xpath

/rfs-graph/node()[local-name() = 'graphml' and namespace-uri() = 'abc']
于 2013-10-01T13:11:06.033 回答
2

xmlns="abc"不是标准属性,它是命名空间前缀声明。在这种情况下,因为省略了前缀,它实际上是为该节点(和所有子节点)指定默认命名空间

您的 XPath 在第二种情况下不匹配的原因是因为节点的名称不只是graphml, 它的abc:graphml, 即它在abc命名空间中。您的 XPath 应该看起来像这样。

/rfs-graph/a:graphml[1]

在前缀a已映射到abc命名空间的地方,我认为在 PL/SQL 中执行此操作的方法如下

lx_b := lx_a.extract('/rfs-graph/a:graphml[1]', 'xmlns:a="abc"');

但我不确定,因为我以前从未写过一行 PL/SQL。

于 2013-10-01T13:13:02.890 回答