【问题标题】:XML parsing in oracle pl/sqloracle pl/sql中的XML解析
【发布时间】:2012-08-15 01:55:23
【问题描述】:

我正在尝试在 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--

【问题讨论】:

  • 怎么不成功?它会出错吗?如果是这样,错误是什么?

标签: xml oracle plsql


【解决方案1】:

我认为你这里有两点错误:

  • 首先,您的 XPath 表达式 //@GovernmentCode/ 是错误的。它不应该有尾随 /,而且您也不想要 @,因为 GovernmentCode 是一个元素,而不是一个属性。

  • 其次,您必须在对 EXTRACTVALUE 的调用以及对 EXTRACT 的调用中指定 XML 命名空间声明。

进行这些更改后,您将获得以下代码。我给了它一个快速测试,它似乎工作:

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;   

【讨论】:

【解决方案2】:

你可以使用正则表达式将xmlns替换为空字符串...然后你可以读取xml列

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

【讨论】:

    猜你喜欢
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    相关资源
    最近更新 更多