Oracle - Как захватить значение в теге XML - PullRequest
0 голосов
/ 06 июля 2018

нужна помощь с ниже. Если я хотел получить значение для определенного тега, как я могу подойти к тому же? например

Я хотел получить значение (800.422.2762 (США и Канада)) из выделенного тега.

<text top="89" left="611" width="177" height="11" font="1">800.422.2762 (U.S. and Canada)</text>

короче говоря, я хотел жестко закодировать этот тег для захвата базового значения при каждом запуске моей программы.

Пример XML:

 <?xml version="1.0" encoding="UTF-8"?>
<pdf2xml producer="popple`enter code here`r" version="0.51.0">
<page number="1" position="absolute" top="0" left="0" height="1188" width="918">
   <fontspec id="0" size="27" family="Helvetica" color="#000000"/>
   <fontspec id="1" size="9" family="Helvetica" color="#000000"/>
   <fontspec id="2" size="9" family="Helvetica" color="#000000"/>
   <fontspec id="3" size="9" family="Times" color="#000000"/>
   <fontspec id="4" size="12" family="Helvetica" color="#000000"/>
   <fontspec id="5" size="12" family="Helvetica" color="#000000"/>
   <fontspec id="6" size="9" family="Helvetica" color="#000000"/>
<image top="27" left="54" width="203" height="108" src="ext-resources\bin\asdf-1_1.jpg"/>
<text top="103" left="346" width="123" height="28" font="0"><b>INVOICE</b></text>
<text top="75" left="611" width="211" height="11" font="1">+1 913.217.6000, Fax +1 913.341.3742</text>
<text top="89" left="611" width="177" height="11" font="1">800.422.2762 (U.S. and Canada)</text>
<text top="102" left="611" width="230" height="11" font="1">headquarters@armaintl.org, www.arma.org</text>
<text top="32" left="611" width="104" height="11" font="1">ARMA International</text>
</page>
</pdf2xml>

Пока что я попробовал следующий подход. Мне удалось извлечь данные, но я хотел извлечь конкретное значение на основе жестко закодированного тега. Пожалуйста, помогите с подходом.

WITH data
     AS (SELECT xmltype (
                   '<?xml version="1.0" encoding="UTF-8"?>
<pdf2xml producer="popple`enter code here`r" version="0.51.0">
<page number="1" position="absolute" top="0" left="0" height="1188" width="918">
   <fontspec id="0" size="27" family="Helvetica" color="#000000"/>
   <fontspec id="1" size="9" family="Helvetica" color="#000000"/>
   <fontspec id="2" size="9" family="Helvetica" color="#000000"/>
   <fontspec id="3" size="9" family="Times" color="#000000"/>
   <fontspec id="4" size="12" family="Helvetica" color="#000000"/>
   <fontspec id="5" size="12" family="Helvetica" color="#000000"/>
   <fontspec id="6" size="9" family="Helvetica" color="#000000"/>
<image top="27" left="54" width="203" height="108" src="ext-resources\bin\asdf-1_1.jpg"/>
<text top="103" left="346" width="123" height="28" font="0"><b>INVOICE</b></text>
<text top="75" left="611" width="211" height="11" font="1">+1 913.217.6000, Fax +1 913.341.3742</text>
<text top="89" left="611" width="177" height="11" font="1">800.422.2762 (U.S. and Canada)</text>
<text top="102" left="611" width="230" height="11" font="1">headquarters@armaintl.org, www.arma.org</text>
<text top="32" left="611" width="104" height="11" font="1">ARMA International</text>
</page>
</pdf2xml>')
                   xmldoc
           FROM DUAL)
SELECT x.*
  FROM data,
       XMLTABLE ('/pdf2xml/page/text'
                 PASSING xmldoc
                 COLUMNS text VARCHAR2 (50) PATH '/text') x
/

Выход:

TEXT
--------------------------------------------------
INVOICE
+1 913.217.6000, Fax +1 913.341.3742
800.422.2762 (U.S. and Canada)
headquarters@armaintl.org, www.arma.org
ARMA International

Ответы [ 3 ]

0 голосов
/ 06 июля 2018

Или измените запрос на:

SELECT x.*
FROM data,
   XMLTABLE ('/pdf2xml/page/text'
             PASSING xmldoc
             COLUMNS 
             text VARCHAR2 (50) PATH '/text',
             top  number        PATH '@top',
             left  number       PATH '@left',
             width  number      PATH '@width',
             height  number     PATH '@height',
             font    number     PATH '@font'
             ) x
where x.top = 89
and x.left = 611
and x.width = 177
and x.height = 11
and x.font = 1;
0 голосов
/ 06 июля 2018

Если у вас есть только один исходный документ и вам нужно только одно значение узла, вы можете использовать XMLQuery вместо XMLTable с небольшим изменением XPath @ wolφi:

select XMLQuery('/pdf2xml/page/text[@top=89]/text()'
  passing xmldoc
  returning content) as text
from data;

, который дает вам фрагмент XML,или

select XMLQuery('/pdf2xml/page/text[@top=89]/text()'
  passing xmldoc
  returning content).getStringVal() as text
from data;

, который дает вам строку:

TEXT                          
------------------------------
800.422.2762 (U.S. and Canada)

XMLTable - это путь, если у вас действительно есть несколько документов или узлов, хотя, конечно.

0 голосов
/ 06 июля 2018

Просто измените XQuery с

'/pdf2xml/page/text'

до

'/pdf2xml/page/text[@top=89]'

и результат будет

800.422.2762 (U.S. and Canada)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...