XML 简介
XML 可扩展标记语言(eXtensible Markup Language),XML 标签没有被预定义,需要自行定义标签。
XML 元素与属性
<元素名 属性名1="属性值1" 属性名2="属性值2"></元素名>
<元素名 属性名1="属性值1" 属性名2="属性值2"/>
在 XML 中,空格会被保留。所有元素都必须有关闭标签,XML 标签对大小写敏感,XML 的属性值必须加引号(单引号和双引号均可使用)。特定的属性名在同一个元素标记中只能出现一次。
示例:
<!-- xml的版本和编码格式 -->
<?xml version="1.0" encoding="UTF-8"?>
<!-- 这里是注释 -->
<![CDATA[
]]>
CDATA - (未解析)字符数据
XML 特殊字符替换
~!@#$%^*()-+={}[],.?/\:;|
在 xml 中是可以直接使用的。
以下是不可以直接使用的字符,需要指定的字符进行替换:
实际 | 替换 |
---|---|
< | < |
> | > |
& | & |
' | ' |
" | " |
对于无法正常使用的字符,也可采取几个自定义的固定字符来进行替换。
解析 XML 文件
-
XML的解析方式有四种:
DOM解析;
SAX解析;
JDOM解析;
DOM4J解析。
这里只给出后面两种方式,下面为要解析的xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 注释 -->
<str>
<test name="测试"/>
<data>
<mainTable>
<field>
<fieldName>ID1</fieldName>
<fieldValue>内容ID1</fieldValue>
</field>
<field>
<fieldName>ID2</fieldName>
<fieldValue>内容ID2</fieldValue>
</field>
</mainTable>
</data>
<type typeName="元素名" tableName="0000">
<user name="小红" age="16"/>
<user name="小明" age="17"/>
<user name="小王" age="18"/>
</type>
</str>
Jdom
所需jar包:下面例子采用的是jdom2-2.0.6.jar。也可以用jdom.jar。
常用方法 | 说明 |
---|---|
Document对象.getRootElement() | 获取根节点Element对象 |
Element对象.getChild(“节点名”); | 获取子节点对象 |
Element对象.getChildren() | 获取该节点下相同的节点生成List |
Element对象.getAttributeValue(“属性名”) | 获取对应节点,对应属性名的属性值 |
Element对象.getValue() | 获取对应节点的文本值 |
Element对象.getName() | 获取对应节点的元素名 |
import java.io.File;
import java.io.FileInputStream;
import java.util.List;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
public class JdomUtil {
public static void main(String[] args) {
JdomUtil.resolveXml("E:/final/SpringBoot/src/main/java/com/util/file/xml/test.xml");
}
public static void resolveXml(String path) {
FileInputStream fis = null;
try {
fis = new FileInputStream(new File(path));
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(fis);
// 获取根节点
Element root = doc.getRootElement();
System.out.println("根节点元素名:" + root.getName());
// 获取子节点
Element test = root.getChild("test");
System.out.println("获取test节点的属性值:" + test.getAttributeValue("name"));
Element data = root.getChild("data");
Element mainTable = data.getChild("mainTable");
List lists = mainTable.getChildren();
for (int k = 0; k < lists.size(); k++) {
Element field = (Element) lists.get(k);
Element fieldName = field.getChild("fieldName");
Element fieldValue = field.getChild("fieldValue");
System.out.println(fieldName.getValue() + "-" + fieldValue.getValue());
}
Element node = root.getChild("type");
System.out.println(node.getAttributeValue("typeName"));
System.out.println(node.getAttributeValue("tableName"));
// 遍历多个相同子节点
List list = node.getChildren();
String name = "", age = "";
for (int i = 0; i < list.size(); i++) {
Element user = (Element) list.get(i);
name = user.getAttributeValue("name");
age = user.getAttributeValue("age");
System.out.println(name + "-" + age);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
Dom4J
所需jar包:下面例子采用的是dom4j-1.6.1.jar。
常用方法 | 说明 |
---|---|
Document对象.getRootElement() | 获取根节点Element对象 |
Element对象.element(“子节点名”) | 获取子节点对象 |
Element对象.elementIterator() | 获取该节点下相同的节点生成Iterator |
Element对象.attribute(“属性名”).getValue() | 获取对应节点,对应属性名的属性值 |
Element对象.getText() Element对象.getStringValue() | 获取对应节点的文本值 |
Element对象.getName() | 获取对应节点的元素名 |
import java.io.File;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Dom4JUtil {
public static void main(String[] args) {
Dom4JUtil.resolveXml("E:/jiaokong_datacenter_final/SpringBoot/src/main/java/com/util/file/xml/test.xml");
}
public static void resolveXml(String path) {
SAXReader builder = new SAXReader();
Document document = null;
try {
document = builder.read(new File(path));
} catch (Exception e) {
e.printStackTrace();
}
// 获取根节点
Element root = document.getRootElement();
System.out.println("根节点名:" + root.getName());
// 获取子节点
Element test = root.element("test");
System.out.println("获取test节点的属性值:" + test.attribute("name").getValue());
Element data = root.element("data");
Element mainTable = data.element("mainTable");
Iterator<Element> ite = mainTable.elementIterator();
while (ite.hasNext()) {
Element field = ite.next();
Element fieldName = field.element("fieldName");
Element fieldValue = field.element("fieldValue");
System.out.println(fieldName.getStringValue() + "-" + fieldValue.getText());
}
Element node = root.element("type");
System.out.println(node.attribute("typeName").getValue());
System.out.println(node.attribute("tableName").getValue());
Iterator<Element> iter = node.elementIterator();
String name = "", age = "";
while (iter.hasNext()) {
Element user = iter.next();
name = user.attribute("name").getValue();
age = user.attribute("age").getValue();
System.out.println(name + "-" + age);
}
}
}
运行结果: