0

需要读取 XML 文档并获取元素标签的值及其值。但在运行时之前,XML 元素节点的值是未知的。所以不能使用 XPATH 来提取值。处理此问题的任何建议

假设这是我拥有的 xml。所有元素名称都是未知的。不知道有多少。我想获取元素名称、元素级别、值。此 xml 包含另一个 xml 文档的模板。

<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>
4

2 回答 2

0

很少解释发生了什么。

  1. Xml 示例从https://www.w3schools.com/xml/复制而来。
  2. '//*[text()]'- 从 xml 中选择所有文本节点
  3. for ordinality- 为 xml 生成行号
  4. name(.)local-name(.)- 返回节点名称,带或不带命名空间前缀
  5. string-join(ancestor-or-self::*/name(.),"/")- 文本节点的路径(所有父节点)
  6. ./text()- 节点值

.

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
于 2019-10-11T10:52:53.273 回答
0

我们可以使用 DBMS_XMLDOM 内置封装方法,[DBMS_XMLDOM]:https ://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_xmldom.htm#i1076719

于 2019-10-16T04:36:54.063 回答