下面是针对这个话题的详细讲解:
介绍
XML作为一种常见的数据交换格式,有多种方式在Java中进行处理。本文将介绍Java中四种操作XML的方式的比较,包括DOM、SAX、JAXB和StAX。
DOM
DOM(Document Object Model)是一种基于树形结构的解析方式,将XML文件整个读取至内存中形成树结构,通过遍历树结构来访问和修改XML文件。
DOM方式的优点是可以读取整个XML文件,并且可以直接对文档进行修改。缺点是消耗内存较大,特别是对于较大的文档会影响性能。下面是一个使用DOM读取XML文件并打印全部节点的示例:
public void readXmlByDom(String fileName) throws Exception {
File inputFile = new File(fileName);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(inputFile);
System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
NodeList nList = doc.getElementsByTagName("*");
System.out.println("-----------------------");
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
System.out.println("\nCurrent Element :" + nNode.getNodeName());
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
System.out.println("Student roll no : " + eElement.getAttribute("rollno"));
System.out.println("First Name : "
+ eElement.getElementsByTagName("firstname").item(0).getTextContent());
System.out.println("Last Name : "
+ eElement.getElementsByTagName("lastname").item(0).getTextContent());
System.out.println("Nick Name : "
+ eElement.getElementsByTagName("nickname").item(0).getTextContent());
System.out.println("Marks : "
+ eElement.getElementsByTagName("marks").item(0).getTextContent());
}
}
}
SAX
SAX(Simple API for XML)是一种事件驱动的解析方式,采用推式解析,将XML文档按照顺序解析一遍,当解析到某个节点时会触发相应的事件,可以在事件处理方法中对节点进行处理。
SAX方式的优点是解析速度较快,消耗内存较少,缺点是无法实现对整个文档的随意访问和修改。下面是一个使用SAX读取XML文件并打印全部节点的示例:
public void readXmlBySax(String fileName) throws Exception {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() {
boolean bRollno = false;
boolean bFirstname = false;
boolean bLastname = false;
boolean bNickname = false;
boolean bMarks = false;
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
System.out.println("Start Element :" + qName);
if (qName.equalsIgnoreCase("STUDENT")) {
String rollNo = attributes.getValue("rollno");
System.out.println("Roll No : " + rollNo);
} else if (qName.equalsIgnoreCase("FIRSTNAME")) {
bFirstname = true;
} else if (qName.equalsIgnoreCase("LASTNAME")) {
bLastname = true;
} else if (qName.equalsIgnoreCase("NICKNAME")) {
bNickname = true;
} else if (qName.equalsIgnoreCase("MARKS")) {
bMarks = true;
}
}
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println("End Element :" + qName);
}
public void characters(char ch[], int start, int length) throws SAXException {
if (bFirstname) {
System.out.println("First Name : " + new String(ch, start, length));
bFirstname = false;
} else if (bLastname) {
System.out.println("Last Name : " + new String(ch, start, length));
bLastname = false;
} else if (bNickname) {
System.out.println("Nick Name : " + new String(ch, start, length));
bNickname = false;
} else if (bMarks) {
System.out.println("Marks : " + new String(ch, start, length));
bMarks = false;
}
}
};
saxParser.parse(fileName, handler);
}
JAXB
JAXB(Java Architecture for XML Binding)是一个通过Java的注解方式,将Java对象序列化为XML文件,或将XML文件反序列化为Java对象的工具。JAXB提供了将Java对象编组和反编组到xml的方式。
JAXB使用起来简单且方便,将Java对象转换为XML文件或者反过来,只需要使用JAXBContext进行一些简单配置即可完成。下面是一个使用JAXB将Java对象转换为XML文件的示例:
public void marshal(Students students, String fileName) throws JAXBException, FileNotFoundException {
JAXBContext context = JAXBContext.newInstance(Students.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(students, new FileOutputStream(fileName));
}
StAX
StAX(Streaming API for XML)是一种基于迭代器的解析方式,与SAX方式类似,也是按照顺序解析XML文件,但是相比SAX,StAX提供了一种更简单易用的API,同时可以满足更多的需求。
StAX方式的优点是解析速度快,对于大型文档的效果更为明显。下面是一个使用StAX读取XML文件并打印全部节点的示例:
public void readXmlByStAX(String fileName) throws Exception {
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLEventReader eventReader = factory.createXMLEventReader(new FileReader(fileName));
while (eventReader.hasNext()) {
XMLEvent event = eventReader.nextEvent();
if (event.isStartElement()) {
StartElement startElement = event.asStartElement();
System.out.println("Start Element: " + startElement.getName());
}
if (event.isEndElement()) {
EndElement endElement = event.asEndElement();
System.out.println("End element: " + endElement.getName());
}
}
}
总结
通过以上四种方式的介绍与示例,我们可以看到DOM、SAX、JAXB和StAX各有自己的优缺点。根据具体需求选择最佳的解析方式,可以在保证程序性能的情况下,达到最好的解析XML文档的目的。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java中四种操作xml方式的比较 - Python技术站