Прочитайте документ XML с PL / SQL, тег XML не исправлен - PullRequest
0 голосов
/ 11 октября 2019

Необходимо прочитать 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>

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Мы могли бы использовать встроенные методы пакета DBMS_XMLDOM, [DBMS_XMLDOM]: https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_xmldom.htm#i1076719

0 голосов
/ 11 октября 2019

Небольшое объяснение того, что происходит.

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