如何提取XML文件中的数据?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何提取XML文件中的数据?相关的知识,希望对你有一定的参考价值。

参考技术A 使用SAXReader需要导入dom4j-full.jar包。
dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。
SAXReader parser=new SAXReader();//dom4j解析器
Reader reader;
try
reader = new FileReader("文件.xml");
Document doc=parser.read(reader); //xml加载document象

Element root=doc.getRootElement(); //按照树思想进行解析
List<Element> list=root.elements();//级元素集合elementIterator()
for(Element ele :list)
List<Element> eles = ele.elements();//取需要TWO属性
// 比较取需要two即

如何使用 PL/SQL 从 XML 文件中提取数据

【中文标题】如何使用 PL/SQL 从 XML 文件中提取数据【英文标题】:How to extract data from an XML file using PL/SQL 【发布时间】:2015-11-04 10:35:58 【问题描述】:

如何使用 PL/SQL 从这个 XML 中提取数据?

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE BPS SYSTEM "bpml.dtd">
<BPS Created="2012-04-24 11:40:41">
<Machine SerialNumber="" Site="" SoftwareRelease="MAP_248204031" VersionInfo="" Name="" Type="BPS200">
  <ParameterSection Number="6" StartTime="2012-04-24 11:23:01" EndTime="1970-01-01 00:00:00">
    <HeadercardUnit HeaderCardID="1706539" DepositID="01706539" StartTime="2012-04-24 11:39:57" MilliSec="0" EndTime="2012-04-24 11:40:40" Rejects="NO">
      <Counter Currency="HRK" DenomID="22550" Value="200" Quality="Fit" Output="Stacked" Number="192"></Counter>
      <Counter Currency="HRK" DenomID="22550" Value="200" Quality="Unfit" Output="Stacked" Number="7"></Counter>
    </HeadercardUnit>
  </ParameterSection>
</Machine>
</BPS>

XML 在 DB 中保存为 CLOB。我需要从 XML 中提取以下值:

货币 DenomID 价值 质量 输出 ...

【问题讨论】:

您需要从 XML 中提取哪些具体数据? 嗨@nop77svk,我想提取货币、denomID、价值、数量、输出......但是这个xml作为CLOB保存在数据库中。 【参考方案1】:

您需要能够在 PL/SQL 中解析该 XML。有内置的软件包可以做到这一点。解析 XML 后,可以使用 extract 函数从中获取数据。

DECLARE
  x XMLType := XMLType(
    '<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
     <!DOCTYPE BPS SYSTEM "bpml.dtd">
     <BPS Created="2012-04-24 11:40:41">
         <Machine SerialNumber="" Site="" SoftwareRelease="MAP_248204031" VersionInfo="" Name="" Type="BPS200">
             <ParameterSection Number="6" StartTime="2012-04-24 11:23:01" EndTime="1970-01-01 00:00:00">
                 <HeadercardUnit HeaderCardID="1706539" DepositID="01706539" StartTime="2012-04-24 11:39:57" MilliSec="0" EndTime="2012-04-24 11:40:40" Rejects="NO">
                     <Counter Currency="HRK" DenomID="22550" Value="200" Quality="Fit" Output="Stacked" Number="192"></Counter>
                     <Counter Currency="HRK" DenomID="22550" Value="200" Quality="Unfit" Output="Stacked" Number="7"></Counter>
                 </HeadercardUnit>
             </ParameterSection>
         </Machine>
     </BPS>');
BEGIN
  FOR r IN (
    SELECT ExtractValue(Value(p),'/@Currency') as currency
          ,ExtractValue(Value(p),'/@DenomID') as denomid
          ,ExtractValue(Value(p),'/@Value') as val
    FROM   TABLE(XMLSequence(Extract(x,'/BPS/Machine/ParameterSection/HeaderCardUnit/Counter'))) p
    ) LOOP
    -- you can use values for r.currency, r.denomid, r.val
    NULL;
  END LOOP;
END;

【讨论】:

嗨@Pablo Santa Cruz,这是我使用的提取方法。正如在每个标签中一样,值是属性。如何提取?转换器:= XMLPARSER.NEWPARSER; XMLPARSER.PARSECLOB(转换器,xml_content); XmlDoc := XMLPARSER.GETDOCUMENT(转换器); WABlockList := XMLDOM.GETELEMENTSBYTAGNAME(XmlDoc,'BPS'); 我需要从这一行得到这个值 '22550', '200', 'Fit'... 【参考方案2】:

我没有“bpml.dtd”文件。我已经删除了第二行。

See more information here

DECLARE
  x XMLTYPE := XMLTYPE(
    '<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
     <BPS Created="2012-04-24 11:40:41">
         <Machine SerialNumber="" Site="" SoftwareRelease="MAP_248204031" VersionInfo="" Name="" Type="BPS200">
             <ParameterSection Number="6" StartTime="2012-04-24 11:23:01" EndTime="1970-01-01 00:00:00">
                 <HeadercardUnit HeaderCardID="1706539" DepositID="01706539" StartTime="2012-04-24 11:39:57" MilliSec="0" EndTime="2012-04-24 11:40:40" Rejects="NO">
                     <Counter Currency="HRK" DenomID="22550" Value="200" Quality="Fit" Output="Stacked" Number="192"></Counter>
                     <Counter Currency="HRK" DenomID="22550" Value="200" Quality="Unfit" Output="Stacked" Number="7"></Counter>
                 </HeadercardUnit>
             </ParameterSection>
         </Machine>
     </BPS>');
BEGIN
  FOR y IN (
    SELECT Value(p).extract('/Counter/@Currency').getStringVal() as currency,
          Value(p).extract('/Counter/@DenomID').getNumberVal() as denomid,
          Value(p).extract('/Counter/@Value').getNumberVal() as val,
          Value(p).extract('/Counter/@Quality').getStringVal() as qual,
          Value(p).extract('/Counter/@Output').getStringVal() as output,
           Value(p).extract('/Counter/@Number').getNumberVal() as numb
    FROM   TABLE(XMLSequence(Extract(x,'/BPS/Machine/ParameterSection/HeadercardUnit/Counter'))) p
    ) LOOP

    DBMS_OUTPUT.put_line(y.currency||','||y.denomid||','|| y.val||','||y.qual||','||y.output||','|| y.numb );

    NULL;
  END LOOP;
END;

【讨论】:

你的'c'代表什么? FROM TABLE(c(Extract(x,'/BPS/Machine/ParameterSection/HeadercardUnit/Counter'))) p) LOOP 我的数据作为 CLOB 保存在 DB 中.. 这个方法不行 XMLTABLE 可以在您将 xml 保存在数据库中时执行此操作。如果你给我表格结构以及你得到了什么错误,我可能会有所帮助。 我在 DB 中的 xml 是我在顶部共享的 xml 我能知道你如何删除第二行吗?我已经解决了这个 clob 到 xml 的问题。

以上是关于如何提取XML文件中的数据?的主要内容,如果未能解决你的问题,请参考以下文章

提取文件夹中所有xml文件中的数据到txt(为人脸识别级联器使用的txt做准备)

如何仅从 xml 文件中提取特定部分并合并它们?

如何从 XML 文件中提取所有标签及其子项?

我们如何使用文件系统中的某些动态字段搜索存储在 zip 文件中的 xml 文件?

java中如何读取xml中数据。多节点的。给我一个例子,谢谢。

如何从 XML 数据中提取特定数据