【问题标题】:How to read xml file using Sax/Dom parser in Java?如何在 Java 中使用 Sax/Dom 解析器读取 xml 文件?
【发布时间】:2014-06-09 02:08:45
【问题描述】:

我想问你一个问题。我想使用 sax/dom 解析器从 xml 读取数据,但我不知道如何在 java 中实现代码。任何帮助都非常感谢...

以下是有关要求的文字:

1/xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<rootElement>
<property name="ireport.zoom" value="1.0"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="0"/>
<queryString>
    <![CDATA[SELECT * FROM ORDERS]]>
</queryString>
<field name="ORDERID" class="java.lang.Integer"/>
<field name="CUSTOMERID" class="java.lang.String"/>
<field name="EMPLOYEEID" class="java.lang.Integer"/>
<field name="ORDERDATE" class="java.sql.Timestamp"/>
<field name="REQUIREDDATE" class="java.sql.Timestamp"/>
<field name="SHIPPEDDATE" class="java.sql.Timestamp"/>
<field name="SHIPVIA" class="java.lang.Integer"/>
<field name="FREIGHT" class="java.math.BigDecimal"/>
<field name="SHIPNAME" class="java.lang.String"/>
<field name="SHIPADDRESS" class="java.lang.String"/>
<field name="SHIPCITY" class="java.lang.String"/>
<field name="SHIPREGION" class="java.lang.String"/>
<field name="SHIPPOSTALCODE" class="java.lang.String"/>
<field name="SHIPCOUNTRY" class="java.lang.String"/>
<background>
    <band splitType="Stretch"/>
</background>
<columnHeader>
    <band height="20" splitType="Stretch">
        <staticText>
            <reportElement uuid="da31a9d4-8ee7-481d-8b51-270539a2fdec" x="460" y="0" width="92" height="20"/>
            <textElement>
                <font isBold="true" isItalic="true" isUnderline="true"/>
            </textElement>
            <text><![CDATA[SHIPPEDDATE]]></text>
        </staticText>
    </band>
</columnHeader>
<detail>
    <band height="20" splitType="Stretch">
        <textField>
            <reportElement uuid="60fb99da-64ef-4bf9-8a96-687c433be35a" x="460" y="0" width="92" height="20"/>
            <textElement>
                <font isBold="true" isItalic="true" isUnderline="true"/>
            </textElement>
            <textFieldExpression><![CDATA[$F{SHIPPEDDATE}]]></textFieldExpression>
        </textField>
    </band>
</detail>
</rootElement>

2/ 预期结果:

element         : property
elment value    : null
attribute name  : name
attribute value : ireport.zoom 
attribute name  : value
attribute value : 1.0 

element         : property
elment value    : null
attribute name  : name
attribute value : ireport.x
attribute name  : value
attribute value : 0

element         : property
elment value    : null
attribute name  : name
attribute value : ireport.y
attribute name  : value
attribute value : 0

element         : queryString
elment value    : SELECT * FROM ORDERS
attribute name  : null
attribute value : null

element         : ORDERID
attribute name  : class
attribute value : java.lang.Integer

关于使用 java 程序的 sax/dom 解析器技术有什么想法吗? 提前致谢。

【问题讨论】:

  • 您的 xml 文件格式不正确(rootElement 永远不会关闭)。我猜这是复制和粘贴错误?
  • 您是否尝试在任何地方搜索“Java SAX 示例”之类的内容?
  • @DavidEhrmann,我也尝试过这样做,但它不符合我的要求。如有需要,请参考这个网址:stackoverflow.com/questions/24113529/…
  • 大多数 XML 解析器都带有用于 DOM 和 SAX 的示例程序。如果您没有,请尝试查看the Apache Xerces examples
  • 如果您希望在另一个文件或输出流中准确地输出此输出,您应该研究 XSLT 和 FO,而不是用 Java 手写转换。这样,您所要做的就是编写通用代码,真正的工作在您的 .xslt 文件中完成。

标签: java xml saxparser domparser


【解决方案1】:

与此主题相关的SAX example tutorial 是一个不错的开始。


SAXParser Documentation 中所见,一种解析方法是使用DefaultHandler

您主要关心并需要覆盖的三个“事件”是startElementendElementcharacters

startElement 内部,您将捕获标记的qName(元素),它与Attributes 相关联。

characters 内部,您将捕获标记值(元素值)。

到标签关闭时,您将捕获所有所需的数据。您可以使用endElement 打印/存储该信息。


您将从DefaultHandler 扩展名开始

class MyHandler extends DefaultHandler {
  @Override
  public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
     //Capture tag name and attributes
     super.startElement(uri, localName, qName, attributes);  
  }

  @Override
 public void characters(char[] ch, int start, int length) throws SAXException {
     //Capture value.  
     super.characters(ch, start, length);  
  }

  @Override
  public void endElement(String uri, String localName, String qName) throws SAXException {
    //Print or store the information
  }
}

并相应地为每个事件提供实现。

【讨论】:

  • 感谢您提供有用的解决方案。顺便说一句,如果我希望将所有值(如 tagName、attributeName、attributeValue 和 Element 的值)存储在一个地方,是否可以?我的意思是我需要它们的集合才能与其他线程一起使用。
  • 是的,这是可能的。您必须提供一些数据结构来存储您收集的信息并对其进行索引/散列以供以后检索。解析完成后,您将在处理程序上有一个方法来返回数据。
  • 我明白了。但如果有必要,你能把我带到那个目的吗?任何样品也很感激。
  • 查看this example。它与您指定的不完全一样,但足够接近,您可以看到它是如何工作的,并完全按照您的意愿完成。
猜你喜欢
  • 1970-01-01
  • 2017-07-27
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
相关资源
最近更新 更多