Oracle 使用PL/SQL读取XML文档,XML标记不固定
需要读取XML文档并获取元素标记的值及其值。但在运行时之前,XML元素节点的值是未知的。所以不能使用XPATH来提取值。有没有处理这个问题的建议 假设这就是我拥有的xml。所有元素的名称都是未知的。不知道有多少。我想要得到的元素名称、元素级别、值。 此xml包含另一个xml文档的模板Oracle 使用PL/SQL读取XML文档,XML标记不固定,oracle,plsql,plsql-package,Oracle,Plsql,Plsql Package,需要读取XML文档并获取元素标记的值及其值。但在运行时之前,XML元素节点的值是未知的。所以不能使用XPATH来提取值。有没有处理这个问题的建议 假设这就是我拥有的xml。所有元素的名称都是未知的。不知道有多少。我想要得到的元素名称、元素级别、值。 此xml包含另一个xml文档的模板 <d2> <d3> <d4> <d5> <d6>@name@</
<d2>
<d3>
<d4>
<d5>
<d6>@name@</d6>
<d6>@name@</d6>
</d5>
<d5>
<d6>@name@</d6>
<d6>@name@</d6>
</d5>
<d5>@name@</d5>
<d5>@name@</d5>
</d4>
</d3>
<d3>@name@</d3>
<d3>
<d4>@name@</d4>
<d4>
<d5>@age@</d5>
<d5>
<d6>@name@</d6>
<d6>@date@</d6>
</d5>
</d4>
</d3>
</d2>
几乎无法解释发生了什么 Xml示例是从表单中复制的。 '//*[text]'-选择所有文本节点形成xml 对于有序性-为xml生成行数 名称或本地名称-返回带或不带命名空间前缀的节点名称 字符串JoinAsentor或self::*/name.,/-文本节点所有父节点的路径 ./text-节点的值
我们可以使用DBMS\u XMLDOM内置的包方法,[DBMS\u XMLDOM]:值未知,或者整个chierarchy未知?你应该上传一些代码…整个层次结构未知。
with test as (select xmltype('<breakfast_menu>
<food>
<name>Belgian Waffles</name>
<price>$5.95</price>
<description>
Two of our famous Belgian Waffles with plenty of real maple syrup
</description>
<calories>650</calories>
</food>
<food>
<name>Strawberry Belgian Waffles</name>
<price>$7.95</price>
<description>
Light Belgian waffles covered with strawberries and whipped cream
</description>
<calories>900</calories>
</food>
</breakfast_menu>') xx from dual
union all
select xmltype('<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="https://www.w3schools.com/furniture">
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>'
) xx from dual
)
select r.*
from test
, xmltable('//*[text()]' passing xx
columns xp_lp for ordinality
, xp_node varchar(4000) path 'name(.)'
, xp_node1 varchar(4000) path 'local-name(.)'
, xp_parent varchar(4000) path 'string-join(ancestor-or-self::*/name(.),"/")'
, xp_value varchar(4000) path './text()'
, xp_namespaces varchar2(4000) path 'namespace-uri(.)') r