0

PL/SQLでこのXMLを解析しようとしています

<?xml version="1.0" encoding="utf-8"?>
<!--ADOR Acknowledgement 2--> 
<AckTransmission xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.irs.gov/efile">
  <TransmissionHeader recordCount="1">
    <Jurisdiction>ALABAMA</Jurisdiction>
    <TransmissionId>1946157056</TransmissionId>
    <Timestamp>2012-08-16T01:25:47-05:00</Timestamp>
    <Transmitter>
      <ETIN>00000</ETIN>
    </Transmitter>
    <ProcessType>T</ProcessType>
    <AgentIdentifier>ACK</AgentIdentifier>
  </TransmissionHeader>
  <Acknowledgement>
    <SubmissionId>X1684956672</SubmissionId>
    <EFIN>X16849</EFIN>
    <GovernmentCode>ALST</GovernmentCode>
    <SubmissionType>XMLTOM</SubmissionType>
    <TaxYear>9999</TaxYear>
    <SubmissionCategory>MFET</SubmissionCategory>
    <AcceptanceStatus>A</AcceptanceStatus>
    <ContainedAlerts>0</ContainedAlerts>
    <StatusDate>2012-08-16</StatusDate>
  </Acknowledgement>
</AckTransmission>

この XML をテーブルに格納し、関数を使用してデータを抽出しています。しかし、それは成功していません:

SELECT EXTRACTVALUE (VALUE (xml_list), '//@GovernmentCode/') AS SysID
  INTO lv_transid      
  FROM TABLE (
            XMLSEQUENCE (
               EXTRACT (in_xmlclob, '/AckTransmission/Acknowledgement',
                        'xmlns="http://www.irs.gov/efile"'))) xml_list;

この XML を解析してテーブルにロードする方法を教えてください。

また、コメント部分の取得方法を教えてください - ADOR Acknowledgement 2 -

4

2 に答える 2

2

ここであなたが間違っていることが2つあると思います:

  • まず、XPath 式//@GovernmentCode/が間違っています。末尾に を付けるべきではありません。属性ではなく要素であるため、どちらも/必要ありません。@GovernmentCode

  • EXTRACTVALUE次に、 への呼び出しと への呼び出しで、XML 名前空間宣言を指定する必要がありますEXTRACT

これらの変更を行うと、次のコードが残ります。簡単なテストを行ったところ、うまくいくようでした:

SELECT EXTRACTVALUE (VALUE (xml_list), '//GovernmentCode', 'xmlns="http://www.irs.gov/efile"') AS SysID
  INTO lv_transid      
  FROM TABLE (
            XMLSEQUENCE (
               EXTRACT (in_xmlclob, '/AckTransmission/Acknowledgement',
                        'xmlns="http://www.irs.gov/efile"'))) xml_list;   
于 2012-08-19T13:24:35.640 に答える
0

正規表現を使用して xmlns を空の文字列に置き換えることができます...その後、xml 列を読み取ることができます

xml:= regexp_replace(xml,'(xmlns:[a-z]|xmlns).*?(\"|\'').*?(\"|\'')',' ');

于 2014-01-14T22:15:04.077 に答える