Java中解析xml的方式
1. Java中JDK自带方式
package xml;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.ByteArrayOutputStream;
/**
* @author wyp
*/
public class XmlTest {
public static void main(String[] args) throws ParserConfigurationException, TransformerException {
jdkXml();
}
public static void jdkXml() throws ParserConfigurationException, TransformerException {
// 得到DOM解析器工厂
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
// 从解析器工厂的解析器得到Document对象
DocumentBuilder documentBuilder = builderFactory.newDocumentBuilder();
Document document = documentBuilder.newDocument();
// 设置文件头
document.setXmlStandalone(true);
// 创建根元素
Element rootElement = document.createElement("request");
// 创建子元素
Element userElement = document.createElement("user");
// 为子元素添加属性
userElement.setAttribute("mark","xc");
// 创建子子元素
Element idElement = document.createElement("id");
Element nameElement = document.createElement("name");
Element ageElement = document.createElement("age");
Element hobbyElement = document.createElement("hobby");
// 为子子元素添加数据值
idElement.setTextContent("01");
nameElement.setTextContent("张三");
ageElement.setTextContent("24");
hobbyElement.setTextContent("[唱歌, 跳舞]");
// 将子子元素添加到子元素下
userElement.appendChild(idElement);
userElement.appendChild(nameElement);
userElement.appendChild(ageElement);
userElement.appendChild(hobbyElement);
// 将子元素添加到根元素下
rootElement.appendChild(userElement);
// 将根元素添加到Document对象中
document.appendChild(userElement);
// 创建TransformerFactory对象
TransformerFactory transformerFactory = TransformerFactory.newInstance();
// 创建Transformer对象
Transformer transformer = transformerFactory.newTransformer();
// 输出内容是否使用换行
transformer.setOutputProperty(OutputKeys.INDENT,"no");
// 创建字节数组输出流
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
// 写入内容
transformer.transform(new DOMSource(document),new StreamResult(byteArrayOutputStream));
// 获取xml的字符串形式
String xmlString = byteArrayOutputStream.toString();
System.out.println(xmlString);
}
}
输出结果:
<?xml version="1.0" encoding="UTF-8"?><user mark="xc"><id>01</id><name>张三</name><age>24</age><hobby>[唱歌, 跳舞]</hobby></user>
2. Dom4j的方式
Dom4j官方文档:https://dom4j.github.io/
添加依赖
<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
常用方法:
- 创建document对象:
DocumentHelper.createDocument()
- 添加标签:
document.addElement(String name)
- 添加标签中属性:
element.addAttribute(String name, String value)
- 添加标签里的内容:
element.addText(String text)
- document转字符串:
document.asXML()
- 字符串转document:
DocumentHelper.parseText(String text)
- 获取根元素:
document.getRootElement
- 获取节点名称:
element.getName()
- 获取节点属性值:
element.attribute(String name)
- 获取节点下的某一结点:
element.element(String name)
- 获取节点的内容:
element.getText()
- 子元素迭代:
Iterator<Element> elementIterator()
- 元素属性迭代:
Iterator<Attribute> attributeIterator()
OutputFormat类用于格式化输出的xml。
- 紧凑格式:
OutputFormat.createCompactFormat()
- 美化格式:
OutputFormat.createPrettyPrint()
- 设置缩进:
format.setIndentSize(int indentSize)
- 换行:
format.setNewlines(true)
- 去空格:
format.setTrimText(true)
具体用法请参考以下示例
示例
package xml;
import org.dom4j.*;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
/**
* @author wyp
*/
public class DomXml {
public static void main(String[] args) throws IOException, DocumentException {
}
/**
* 创建XML文档
*/
public static Document createDocument() {
Document document = DocumentHelper.createDocument();
Element root = document.addElement("user")
.addAttribute("mark", "xc");
root.addElement("id")
.addText("01");
root.addElement("name")
.addText("张三");
root.addElement("age")
.addText("24");
root.addElement("hobby")
.addText("[唱歌, 跳舞]");
return document;
}
/**
* 打印紧凑格式的xml
*/
public static void printCompactFormat() throws IOException {
//用于创建默认紧凑格式的静态辅助方法。此格式在元素和所有其他空白修剪后没有任何缩进或换行符
OutputFormat format = OutputFormat.createCompactFormat();
XMLWriter xmlWriter = new XMLWriter(System.out, format);
//以format格式打印
xmlWriter.write(createDocument());
xmlWriter.close();
}
/**
* 打印漂亮的格式的xml
*/
public static void printPrettyFormat() throws IOException {
//用于创建默认漂亮打印格式的静态辅助方法。此格式包含 2 个空格的缩进、每个元素后的换行符以及所有其他空格修剪,并且 XMTML 为假
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(System.out, format);
//以format格式打印
xmlWriter.write(createDocument());
xmlWriter.close();
}
/**
* 将xml写入文件
*/
public static void writeToXml() {
try(FileWriter out = new FileWriter("foo.xml");) {
createDocument().write(out);
} catch (IOException e){
e.printStackTrace();
}
}
/**
* 将xml写入文件
*/
public static void writeToXml1() throws IOException {
try(FileWriter out = new FileWriter("foo1.xml");) {
//设置格式
OutputFormat format = new OutputFormat();
format.setIndentSize(4); //缩进为4
format.setNewlines(true); //换行
format.setTrimText(true); //去除空格
XMLWriter xmlWriter = new XMLWriter(out,format);
xmlWriter.write(createDocument());
xmlWriter.close();
}
}
/**
* 字符串与document之间的转换
*/
public static void strDocExchange() throws DocumentException {
//document转字符串
String s = createDocument().asXML();
System.out.println(s);
//字符串转document
Document document = DocumentHelper.parseText(s);
}
/**
* 读取并解析xml文件
*/
public static Document parseXmlFile() throws FileNotFoundException, DocumentException {
SAXReader reader = new SAXReader();
FileReader fileReader = new FileReader("foo.xml");
return reader.read(fileReader);
}
/**
* 解析xml document
*/
public static void parseXmlDocument() {
Document document = createDocument();
Element root = document.getRootElement();
//获取结点名
System.out.println(root.getName());
//获取结点中的某个属性值
System.out.println(root.attribute("mark").getText());
//获取root结点下的name结点
Element name = root.element("name");
//获取该结点下的内容
System.out.println(name.getText());
//迭代器获取root结点下的所有结点
Iterator<Element> elementIterator = root.elementIterator();
while (elementIterator.hasNext()) {
Element next = elementIterator.next();
System.out.println(next.getName() + "-" + next.getText());
}
//迭代器获取root结点下的所有属性
Iterator<Attribute> attributeIterator = root.attributeIterator();
while (attributeIterator.hasNext()) {
Attribute next = attributeIterator.next();
System.out.println(next.getName() + "-" + next.getText());
}
}
}