如何在Java中使用Sax/Dom解析器读取xml文件?

如何在Java中使用Sax/Dom解析器读取xml文件?

问题描述:

我想问你一个问题。我想使用sax/dom解析器从xml读取数据,但我不知道如何在java中实现代码。任何帮助的高度赞赏...如何在Java中使用Sax/Dom解析器读取xml文件?

下面的文本有关要求:

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解析器技术? 在此先感谢。

+0

您的xml文件格式不正确(rootElement从不关闭)。我想这是一个复制和粘贴错误? – f*

+0

您是否尝试在任何位置搜索“Java SAX示例?”之类的东西? –

+0

@DavidEhrmann,我也试图这样做,但它不符合我的要求。如果有必要,请参阅此网址:http://*.com/questions/24113529/how-to-get-elements-value-from-xml-using-sax-parser-in-startelement – sakura

与此主题相关的SAX example tutorial是一个非常好的开始。


如在SAXParser Documentation看出,一种方法来解析是使用DefaultHandler

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

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 
    } 
} 

启动并提供相应的每个事件的执行。

+0

感谢您提供有用的解决方案。 顺便说一句,如果我想在一个地方像tagName,attributeName,attributeValue和Element的Value存储的所有值,可能吗?我的意思是我需要将它们设置为与其他线程一起使用。 – sakura

+0

是的,这是可能的。您必须提供一些数据结构,以便在收集信息时存储信息并对其进行索引/散列以供稍后检索。解析完成后,您将在处理程序上有一个方法来返回数据。 – Origineil

+0

我明白了。但是如果有必要的话,你可以让我达到这个目的吗? 任何样品也赞赏。 – sakura