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

我认为您在这里有两件事有误:

  • 首先,您的 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 回答