解析XML文件

来源:互联网 发布:文字语音播报软件 编辑:程序博客网 时间:2024/06/06 08:39

总结两种解析包解析XML文件

Jaxp(sun,j2se)、dom4j(dom4j)

一.JAXP解析XML文件

   JAXP 开发包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包及其子包组成

1)使用JAXP进行DOM解析
   javax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 , DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个 newInstance方法 ,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。

解析步骤:

 1:调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。
    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();

 2:调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。
    DocumentBuilder builder = builderFactory.newDocumentBuilder();

 3:调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。
    Document doc = builder.parse(new File("book.xml"));

DOM模型(document object model)
    DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点),并以树的结构组织起来,存储到内存中。
   JAXP中的文档对象:
      Document:文档
      Element:元素
      Attr:属性
     CharacterData:标签体

对文档树的增删该查只是对内存中的对象进行的操作,如果希望将修改对xml文件起作用,就需要进行XML文档更新

更新XML文件步骤:

javax.xml.transform包中的Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出
  1: 获取Transformer工厂    
        TransformerFactory transformerFactory  =TransformerFactory.newInstance();
  2:获取Transfomer对象
        Transformer transformer =  transformerFactory.newTransformer();

  3:设置输出属性的编码

      transformer.setOutputProperty(OutputKeys.ENCODING,"gb2312");

  4:创建代表输入和输出的Source和Result对象
        Source source = new DOMSource(doc);
        Result result = new StreamResult(new FIle("book.xml"));
使用Transformer将 XMLSource 转换为 Result
        transformer.transform(source , Result);


2)使用JAXP进行SAX解析

   SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分:解析器和事件处理器。

   SAX每当解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。

阅读ContentHandler API文档,常用方法:startElement、endElement、characters。

SAX解析XML文件的步骤:

    1:使用SAXParserFactory创建SAX解析工厂
       SAXParserFactory spf = SAXParserFactory.newInstance();
    2:通过SAX解析工厂得到解析器对象        
       SAXParser sp = spf.newSAXParser();

    3:通过解析器对象得到一个XML的读取器
       XMLReader xmlReader = sp.getXMLReader();

    4:设置读取器的事件处理器
        xmlReader.setContentHandler(new MyContentHandler());

    5:解析xml文件    
        xmlReader.parse("book.xml");


ContentHandler:

void setContentHandler(ContentHandler handler)
ContentHandler是一个接口,我们可以自己写一个类实现这个接口,其中提供了如下重要的方法:
 void characters(char[] ch, int start, int length)
  接收字符数据的通知。
endDocument()
接收文档的结尾的通知。
startDocument()
接收文档的开始的通知。
startElement(String uri, String localName, String qName, Attributes atts)
接收元素开始的通知。
void endElement(String uri, String localName, String qName)
接收元素结束的通知。

DefaultHandler是一个类,他默认实现了ContentHandler接口,并提供了其中所有方法的空实现,我们可以自己写一个类继承这个类,复写其中我们需要使用到的方法即可


DOM4J解析XML

Dom4j是一个简单、灵活的开放源代码的库。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。 Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使    用的特点。现在很多软件采用的Dom4j

使用Dom4j开发,需下载dom4j相应的jar文件

DOM4J解析XML的步骤:

  1:创建解析器:
        SAXReader reader = new SAXReader();
  2:利用解析器读入xml文档:

        Document   document = reader.read(new File("input.xml"));
  3:获取文档的根节点:
        Element root = document.getRootElement();


更新XML文件

方式一:

调用Node提供的write(Writer writer) 方法,使用默认方式将节点输出到流中:
        node.write(new FileWriter("book.xml"));

乱码问题:Dom4j在将文档载入内存时使用的是文档声明中encoding属性声明的编码集进行编码,如果在此时使用的writer的内部编码集与最初载入内存时使用的编码集不同则会出现乱码问题。FileWriter默认使用操作系统本地码表即gb2312编码,并且无法更改。此时可以使用OutputStreamWriter(FileOutputStream("filePath"),"utf-8");的方式自己封装一个指定码表的Writer使用,从而解决乱码问题。


方式二:

利用XMLWriter写出Node:

    XMLWriter writer = new XMLWriter(new  FileWriter("output.xml"));

    writer.write(node);

    writer.close();
注意:使用这种方式输出时,XMLWriter首先会将内存中的docuemnt翻译成UTF-8格式的document,在进行输出,这时有可能出现乱码问题。
可以使用OutputFormat 指定XMLWriter转换的编码为其他编码。
    OutputFormat format = OutputFormat.createPrettyPrint();            
    format.setEncoding("GBK");     

    XMLWriter writer = new XMLWriter(newFileWriter("output.xml"),format);
Writer使用的编码集与文档载入内存时使用的编码集不同导致乱码,使用字节流或自己封装指定编码的字符流即可。


原创粉丝点击