目录
一、XML基础知识
1、XML中的转义符
在XML中,有五个预定义的实体引用(也称为转义符)用于表示特殊字符
(1) `<` 表示小于符号 `<`.
(2)`>` 表示大于符号 `>`.
(3)`&` 表示和符号 `&`.
(4)`"` 表示双引号 `"`
(5)`'` 表示单引号 `'`
2、XML不解析标签
如果您想在XML文档中包含标签,但不希望它们被解析为XML元素,您可以使用CDATA(Character Data)部分或者将标签中的特殊字符进行转义。
<![CDATA[ 这里面可以是任何内容 ]]>
3、命名空间
XML命名空间是一种用于在XML文档中避免元素和属性名称冲突的机制。它允许您在不同的XML文档或不同XML标记中使用相同的元素或属性名称,而不会引起混淆。XML命名空间通过在元素和属性名称前添加一个命名空间前缀来实现。
二、测试文件
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="http://www.yiqifu.top" xmlns:C="http://www.yiqifu.top/c" xmlns:D="http://www.yiqifu.top/d">
<Test>默认命名空间的元素值</Test>
<C:Test>C命名空间的元素值</C:Test>
<D:Test>D命名空间的元素值</D:Test>
<A:Test xmlns:A="http://www.yiqifu.top/a1"> A命名空间的元素值1</A:Test>
<A:Test xmlns:A="http://www.yiqifu.top/a2"> A命名空间的元素值2</A:Test>
<B:Test xmlns:B="http://www.yiqifu.top/b1"> B命名空间的元素值1</B:Test>
<B:Test xmlns:B="http://www.yiqifu.top/b2"> B命名空间的元素值2</B:Test>
<List id="1" type="列表1">
<item id="1" name="元素1">元素1的描述</item>
<item id="2" name="元素2">元素2的描述</item>
</List>
<List id="2" type="列表2">
<item id="1" name="元素1">元素1的描述</item>
<item id="2" name="元素2">元素2的描述</item>
</List>
<List id="99" type="列表3">
<item name="元素1"/>
</List>
</root>
三、使用Java标准库javax.xml读写XML
1、加载xml文件
public static void main(String[] args) {
String doc = "test.xml";
Document document = TestLoad(doc);
if(document!=null) {
TestEdit(document);
TestRead(document);
TestSave(document, doc);
}
}
public static Document TestLoad(String path){
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;
builder = factory.newDocumentBuilder();
Document document = builder.parse(path);
return document;
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
2、读取xml文件数据
public static void TestRead(Document document){
NodeList nodeList = document.getElementsByTagName("List");
System.out.println(nodeList.getLength());
for(int listIndex=0; listIndex<nodeList.getLength();listIndex++){
Node node = nodeList.item(listIndex);
Element element = (Element)node;
String listType = element.getAttribute("type");
System.out.println(listType);
NodeList nodeItems = element.getChildNodes();
for(int itemIndex=0; itemIndex<nodeItems.getLength();itemIndex++) {
Node nodeItem = nodeItems.item(itemIndex);
if(nodeItem.getNodeType() == Node.ELEMENT_NODE) {
Element elementItem = (Element) nodeItem;
String itemName = elementItem.getAttribute("name");
System.out.println("\t"+listType+" - "+itemName);
}
}
}
// element.getTagName();
}
3、修改xml文件数据
public static void TestEdit(Document document){
NodeList nodeList = document.getElementsByTagName("List");
for(int listIndex=0; listIndex<nodeList.getLength();listIndex++) {
Node node = nodeList.item(listIndex);
Element element = (Element) node;
String listId = element.getAttribute("id");
if(listId == null || "".equals(listId)){
element.setAttribute("id", (listIndex+1)+"");
}
else if("99".equals(listId) ){
element.getParentNode().removeChild(element);
listIndex--;
}
}
Element elementList = document.createElement("List");
elementList.setAttribute("id", "99");
elementList.setAttribute("type", "列表3");
Element elementItem = document.createElement("item");
elementItem.setAttribute("name", "元素1");
elementList.appendChild(elementItem);
NodeList nodeRoot = document.getElementsByTagName("root");
nodeRoot.item(0).appendChild(elementList);
}
4、将修改保存到xml文件
public static void TestSave(Document document, String path){
try {
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
//transformer.setOutputProperty(OutputKeys.ENCODING, "UTF8");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(new File(path));
transformer.transform(source, result);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
}
三、使用第三方DOM4J库读写XML
1、加载xml文件
public static void main(String[] args) {
String doc = "test.xml";
Document document = TestLoad(doc);
if(document!=null) {
TestEdit(document);
TestRead(document);
TestSave(document, doc);
}
}
public static Document TestLoad(String path){
try {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File(path));
return document;
} catch (DocumentException e) {
e.printStackTrace();
}
return null;
}
2、读取xml文件数据
public static void TestRead(Document document){
Element root = document.getRootElement();
for(Iterator iteratorList = root.elementIterator(); iteratorList.hasNext();){
Object objList = iteratorList.next();
if(!(objList instanceof Element)){
continue;
}
Element element = (Element)objList;
if(!"List".equals(element.getName())){
continue;
}
String listType = element.attributeValue("type");
System.out.println(listType);
for(Iterator iteratorItem = element.elementIterator(); iteratorItem.hasNext();) {
Object objItem = iteratorItem.next();
if(!(objItem instanceof Element)){
continue;
}
Element elementItem = (Element)objItem;
String itemName = elementItem.attributeValue("name");
System.out.println("\t"+listType+" - "+itemName);
}
}
}
3、修改xml文件数据
public static void TestEdit(Document document){
Element root = document.getRootElement();
int index = 0;
for(Iterator iteratorList = root.elementIterator(); iteratorList.hasNext();) {
index++;
Element element = (Element) iteratorList.next();
if(!"List".equals(element.getName())){
continue;
}
String listId = element.attributeValue("id");
if(listId == null || "".equals(listId)){
element.addAttribute("id", index+"");
}
else if("99".equals(listId) ){
element.getParent().remove(element);
}
}
Element elementList = root.addElement("List");
elementList.addAttribute("id", "99");
elementList.addAttribute("type", "列表3");
Element elementItem = elementList.addElement("item");
elementItem.addAttribute("name", "元素1");
}
4、将修改保存到xml文件
public static void TestSave(Document document, String path){
try {
OutputFormat format = OutputFormat.createPrettyPrint();
//format.setEncoding("UTF8");
XMLWriter writer = new XMLWriter(new FileWriter(path), format);
writer.write(document);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
四、其他第三方库
除前面介绍的两种方法外还很多库可以读写xml,例如JDOM 、JAXB、StAX。
1、JDOM (Java Document Object Model) 如DOM类型
JDOM提供了一种方便的方式来表示和操作XML文档,类似于DOM,但更容易使用。它允许您构建、解析和操作XML文档树,以及进行查询和修改操作。
参考地址:hunterhacker/jdom: Java manipulation of XML made easy (github.com)
2、JAXB (Java Architecture for XML Binding) 完成XML与对象映射
JAXB用于将XML数据绑定到Java对象(反序列化)以及将Java对象序列化为XML数据。它主要用于在Java应用程序中映射XML数据到对象模型,以便进行简单的读取和写入。
3、StAX (Streaming API for XML) 大型XML处理
StAX提供了一种基于事件的流式XML处理方法,允许您以迭代方式处理XML文档,适用于大型文档或需要高性能的场景。