Java实现解析并生成xml原理实例详解
简介
XML是一种可扩展标记语言,常用于数据的存储和传输。XML的一个重要的应用场景是作为数据传输的格式,即数据序列化。
Java提供了许多支持XML的API,其中常用的是DOM和SAX。
DOM:将XML文件整个加载到内存中,并生成与XML结构对应的DOM树,可以方便的通过节点操作修改XML内容。但是会占用大量的内存,并且在大文件或者复杂结构的文件中效率不高。
SAX: 基于事件的解析方式,不会一次性将整个XML文件读入内存,而是边读边解析,因此可以很好的处理大文件和复杂结构的文件,但是没有DOM的易用性。
解析XML
DOM
Java提供了javax.xml.parsers包中的DocumentBuilderFactory和DocumentBuilder类来对XML文件进行解析。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new File("example.xml"));
以上代码将example.xml文件加载进内存并解析成一个DOM树,可以通过节点遍历获取XML文件信息。
NodeList nodeList = document.getElementsByTagName("book");
for(int i=0;i<nodeList.getLength();i++){
Element element = (Element)nodeList.item(i);
String id = element.getAttribute("id");
String author = element.getElementsByTagName("author").item(0).getTextContent();
String title = element.getElementsByTagName("title").item(0).getTextContent();
System.out.println("id:"+id+", author:"+author+", title:"+title);
}
以上代码输出XML文件中book节点下的id、author、title信息。
SAX
Java提供了org.xml.sax包中的SAXParser类来对XML文件进行解析。
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler(){
boolean bookFlag = false;
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if(qName.equalsIgnoreCase("book")){
bookFlag = true;
System.out.println("Book ID :" + attributes.getValue("id"));
}
if(qName.equalsIgnoreCase("author") && bookFlag){
System.out.println("Author : ");
}
if(qName.equalsIgnoreCase("title") && bookFlag){
System.out.println("Title : ");
}
}
public void characters(char ch[], int start, int length) throws SAXException {
if(bookFlag){
System.out.println(new String(ch, start, length));
bookFlag = false;
}
}
};
saxParser.parse(new File("example.xml"), handler);
以上代码将example.xml文件不会一次性加载到内存,而是边读边解析。在SAX解析器中,当解析到节点开始标签时会调用startElement方法,在节点结束标签时会调用endElement方法,在节点内容时会调用characters方法。
生成XML
Java提供了javax.xml.transform包中的TransformerFactory和Transformer类来生成XML文件。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();
Element root = document.createElement("library");
document.appendChild(root);
Element book1 = document.createElement("book");
book1.setAttribute("id","001");
Element author1 = document.createElement("author");
author1.setTextContent("Author 1");
Element title1 = document.createElement("title");
title1.setTextContent("Title 1");
book1.appendChild(author1);
book1.appendChild(title1);
root.appendChild(book1);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(new DOMSource(document), new StreamResult(new File("example2.xml")));
以上代码生成了example2.xml文件。
示例说明
解析XML示例
假设有一个example.xml文件,内容如下:
<library>
<book id="001">
<author>Author 1</author>
<title>Title 1</title>
</book>
<book id="002">
<author>Author 2</author>
<title>Title 2</title>
</book>
</library>
通过DOM解析方式可以输出example.xml中所有book节点的id、author、title信息,输出结果:
id:001, author:Author 1, title:Title 1
id:002, author:Author 2, title:Title 2
通过SAX解析方式可以输出example.xml中所有book节点的id、author、title信息,输出结果:
Book ID :001
Author :
Author 1
Title :
Title 1
Book ID :002
Author :
Author 2
Title :
Title 2
生成XML示例
通过以下代码生成了example2.xml文件,内容如下:
<library>
<book id="001">
<author>Author 1</author>
<title>Title 1</title>
</book>
</library>
可以发现,通过生成XML示例,成功创建了一个library节点,library节点下有一个book节点,book节点有id、author、title三个子节点,成功实现了通过Java生成XML文件的功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现解析并生成xml原理实例详解 - Python技术站