下面我将详细讲解“Java生成和解析XML格式文件和字符串的实例代码”的完整攻略以及其中的两个示例。
1. 什么是XML
XML是可扩展标记语言(Extensible Markup Language)的缩写,它是一种用于传输和存储数据的标准格式。XML是自我描述、可扩展的,可以通过文本编辑器或工具生成并解析。在Java应用程序中,XML是一种常见的数据交换格式。
2. 生成XML文件或字符串
在Java中,可以使用DOM或SAX来生成XML文件或字符串。下面分别介绍这两种生成方式的实现。
2.1 使用DOM生成XML文件或字符串
DOM是一种基于内存的解析方式,在生成XML文档时,它会先将整个文档加载到内存中,然后在内存中进行操作,最后再将整个文档输出到文件或字符串中。下面是一个使用DOM生成XML文件或字符串的示例代码:
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.io.File;
public class DomWriter {
public static void main(String[] args) {
try {
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.newDocument();
// 父节点
Element rootElement = doc.createElement("root");
doc.appendChild(rootElement);
// 子节点
Element childElement = doc.createElement("child");
rootElement.appendChild(childElement);
childElement.appendChild(doc.createTextNode("Hello World"));
// 输出到文件或字符串
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
// 输出到文件
StreamResult result = new StreamResult(new File("output.xml"));
transformer.transform(source, result);
// 输出到字符串
StringWriter writer = new StringWriter();
transformer.transform(source, new StreamResult(writer));
String xmlString = writer.getBuffer().toString();
System.out.println(xmlString);
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.2 使用SAX生成XML文件或字符串
SAX是一种基于事件流的解析方式,在生成XML文档时,它会将文档的不同部分分成不同的事件,并且在解析时一次只处理一个事件,适用于较大的XML文件。下面是一个使用SAX生成XML文件或字符串的示例代码:
import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.SAXParser;
import java.io.File;
import java.io.FileWriter;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.Attributes;
public class SaxWriter extends DefaultHandler {
private String elementName;
private FileWriter writer;
public SaxWriter(String fileName) throws Exception {
writer = new FileWriter(new File(fileName));
}
public void startDocument() {
try {
writer.write("<?xml version=\"1.0\"?>\n");
} catch (Exception e) {
e.printStackTrace();
}
}
public void endDocument() {
try {
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public void startElement(String uri, String localName, String qName, Attributes attributes) {
try {
elementName = qName;
writer.write("<" + qName + ">");
} catch (Exception e) {
e.printStackTrace();
}
}
public void endElement(String uri, String localName, String qName) {
try {
writer.write("</" + qName + ">");
} catch (Exception e) {
e.printStackTrace();
}
}
public void characters(char ch[], int start, int length) {
String value = new String(ch, start, length).trim();
if (value.length() > 0) {
try {
writer.write(value);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
try {
String fileName = "output.xml";
SaxWriter handler = new SaxWriter(fileName);
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse(new File(fileName), handler);
} catch (Exception e) {
e.printStackTrace();
}
}
}
3. 解析XML文件或字符串
在Java中,可以使用DOM、SAX或StAX来解析XML文件或字符串。下面介绍这三种解析方式的实现。
3.1 使用DOM解析XML文件或字符串
DOM是一种基于内存的解析方式,在解析XML文档时,它会先将整个文档加载到内存中,然后在内存中进行操作。下面是一个使用DOM解析XML文件或字符串的示例代码:
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;
public class DomReader {
public static void main(String[] args) {
try {
File inputFile = new File("input.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(inputFile);
// 获取根节点
doc.getDocumentElement().normalize();
System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
// 获取子节点
NodeList nList = doc.getElementsByTagName("child");
System.out.println("----------------------------");
for (int i = 0; i < nList.getLength(); i++) {
Node nNode = nList.item(i);
System.out.println("\nCurrent Element :" + nNode.getNodeName());
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
System.out.println("Child element content: " + eElement.getTextContent());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.2 使用SAX解析XML文件或字符串
SAX是一种基于事件流的解析方式,在解析XML文档时,它会将文档的不同部分分成不同的事件,并且在解析时一次只处理一个事件,适用于较大的XML文件。下面是一个使用SAX解析XML文件或字符串的示例代码:
import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.SAXParser;
import java.io.File;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.Attributes;
public class SaxReader extends DefaultHandler {
private String currentElement;
public void startElement(String uri, String localName, String qName, Attributes attributes) {
currentElement = qName;
}
public void characters(char[] ch, int start, int length) {
String content = new String(ch, start, length);
if (currentElement.equals("child")) {
System.out.println("Child element content: " + content);
}
}
public static void main(String[] args) {
try {
String fileName = "input.xml";
SaxReader handler = new SaxReader();
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse(new File(fileName), handler);
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.3 使用StAX解析XML文件或字符串
StAX是Sax和DOM结合的解析方式,它同时具备了Sax的流式处理和DOM的便利操作。下面是一个使用StAX解析XML文件或字符串的示例代码:
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;
import java.io.FileInputStream;
public class StaxReader {
public static void main(String[] args) {
try {
String xmlFile = "input.xml";
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader reader = factory.createXMLStreamReader(new FileInputStream(xmlFile));
String currentElement = "";
while (reader.hasNext()) {
int event = reader.next();
switch (event) {
case XMLStreamConstants.START_ELEMENT:
currentElement = reader.getLocalName();
break;
case XMLStreamConstants.CHARACTERS:
String content = reader.getText().trim();
if (currentElement.equals("child")) {
System.out.println("Child element content: " + content);
}
break;
case XMLStreamConstants.END_ELEMENT:
currentElement = "";
break;
}
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
至此,我们就完成了Java生成和解析XML格式文件和字符串的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java生成和解析XML格式文件和字符串的实例代码 - Python技术站