今天我们来搞一搞 XML操作,网上相关例子比较多,但功能都参差不齐。我这里把之前一直常用的一个类拿出来和大家一起分享。
XmlSax 这个是用Sax的方式进行解析的。所以需要引入 dom4j
1、生产xml文件
默认编码
XmlSax sax1 = new XmlSax();
System.out.println(sax1.toXmlString());
输出:<?xml version="1.0" encoding="utf-8"?>
自定义编码
XmlSax sax2 = new XmlSax(Charset.forName("gbk"));
System.out.println(sax2.toXmlString());
输出:<?xml version="1.0" encoding="GBK"?>
生成自定义XML
XmlSax sax3 = new XmlSax();
Document document = sax3.getDocument();
// 添加一个名为root的元素
Element root = document.addElement("root");
// 在root上添加注释
root.addComment("this is root");
// 在root下面添加一个名为elemant1的元素
Element element1 = root.addElement("element1");
//为elemant1元素 添加id属性,值为myid
element1.addAttribute("id", "this is id");
// 设置element1元素的值
element1.setText("this is element1 value");
System.out.println(sax3.toXmlString());
输出:
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--this is root-->
<element1 id="this is id">this is element1 value</element1>
</root>
//XML 写到文件里面
sax3.writeXML("./test.xml");
//直接将 xml 作为页面返回
sax3.writeXMLToWeb(request,response);
2、读取并解析XML
String xmlString =
"<root>" +
" <element1 id='id1'>this is first elememt1</element1>" +
" <element2>" +
" <element1>this is secend elememt1</element1>" +
" </element2>" +
"</root>";
XmlSax sax4 = new XmlSax(xmlString);
Document document = sax4.getDocument();
2.1 用递进方式进行解析
Element root = document.getRootElement();
Element element;
Attribute attribute;
for(Object elementObj : root.elements())
{
element = (Element) elementObj;
System.out.println(element.getName() + " : " + element.getTextTrim());
System.out.println(element.getName() + " : " + element.getStringValue());
for(Object attributeObj : element.attributes())
{
attribute = (Attribute)attributeObj;
System.out.println(attribute.getName() + " : " + attribute.getValue());
System.out.println(attribute.getName() + " : " + attribute.getStringValue());
}
}
输出:
element1 : this is first elememt1
element1 : this is first elememt1
id : id1
id : id1
element2 :
element2 : this is secend elememt1
2.2 使用Xpath 的形式进行搜索定位
// 寻找所有名字为element1的元素
List elementlist = document.selectNodes("//element1");
Iterator it = elementlist.iterator();
// 迭代
while (it.hasNext()) {
// 取得每一个名为element1的元素
Element element1 = (Element) it.next();
System.out.println(element1.getName() + " : " + element1.getTextTrim());
// 寻找在element1下一层的所有名字为element2的元素
Iterator itor = element1.elementIterator("element2");
while (itor.hasNext()) {
// 取得在element1下面一层的每一个名为element2的元素
Element element2 = (Element) itor.next();
System.out.println(element2.getName() + " : " + element2.getTextTrim());
}
}
输出:
element1 : this is first elememt1
element1 : this is secend elememt1
2.3 直接定位到指定 元素 或 属性
// 寻找所有名字为element2元素的下一层元素名为element1的元素
List elementlist = document.selectNodes("//element2/element1");
Iterator it = elementlist.iterator();
while (it.hasNext()) {
// 取得每一个名为element2的元素下一层的每一个名为element1的元素
Element element1 = (Element) it.next();
System.out.println(element1.getName() + " : " + element1.getTextTrim());
}
输出:
element1 : this is secend elememt1
// 寻找所有名字为element1的属性为id的属性
List namelist = document.selectNodes("//element1/@id");
Iterator it = namelist.iterator();
// 迭代
while (it.hasNext()) {
// 取得每一个element1元素下面名为name的属性
Attribute attribute = (Attribute) it.next();
System.out.println(attribute.getName() + " : " + attribute.getValue());
}
输出:
id : id1
2.4 可以在任意位置进行修改并存储
Element root = document.getRootElement();
Element element1 = root.element("element1");
root.remove(element1);
System.out.println(sax4.toXmlString());
输出:
<?xml version="1.0" encoding="utf-8"?>
<root>
<element2>
<element1>this is secend elememt1</element1>
</element2>
</root>
更多的dom操作,我就不在这里细说了,我这里基本是给dom4j套了一个外壳,已使之方便的读取或写入,在操作方面还是完全使用dom自身的方法。