dom 4 j 操作xml教程
目录
基础操作
XPath 解析xml文件
迭代器循环遍历
快速循环
创建新的XML文档
对XML文档进行增、删、改、查
文档字符串相互转换
基础操作
这是我们要读取的xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!--
config标签:可以包含0~N个action标签
-->
<config name="zs" age="18" sex="男">
<!--
action标签:可以饱含0~N个forward标签
path:以/开头的字符串,并且值必须唯一 非空
type:字符串,非空
-->
<action path="/regAction" type="test.RegAction">
<!--
forward标签:没有子标签;
name:字符串,同一action标签下的forward标签name值不能相同 ;
path:以/开头的字符串
redirect:只能是false|true,允许空,默认值为false
-->
<forward name="failed" path="/reg.jsp" redirect="false" />
<forward name="success" path="/login.jsp" redirect="true" />
</action>
<foo>
</foo>
<action path="/loginAction" type="test.LoginAction">
<forward name="failed" path="/login.jsp" redirect="false" />
<forward name="success" path="/main.jsp" redirect="true" />
</action>
</config>
得到文档对象
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File("src/config.xml"));
获取根节点
Element就是节点类。
Element element = document.getRootElement();
获取指定节点下的直接子节点
List<Element> elements = element.elements();
获取节点的属性值
document.getRootElement().attributeValue("name")
获取节点下的指定子节点对象
Element e = document.getRootElement().element("action");
获取节点的文本
Element foo = document.getRootElement().element("foo");
System.out.println(foo.getText());
XPath 解析xml文件
使用xPath强大的功能快速定位目标元素
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File("xml路径"));
//查找 config 标签下的 action 标签下的所有forward标签,返回多个
List<Node> list = document.selectNodes("/config/action/forward");
//查找config标签下的action标签,如果有多个返回一个
Node node = document.selectSingleNode("/config/action");
//注意Node可以强转成Element
Element element = (Element)node;
迭代器循环遍历
public static void bar(Document document) {
Element root = document.getRootElement();
// 迭代root节点下的直接子节点
for (Iterator<Element> it = root.elementIterator(); it.hasNext();) {
Element element = it.next();
System.out.println(element.getName());
}
System.out.println("我是分割线 ---------- root.elementIterator(\"foo\")");
// 迭代root节点下的直接子节点, 但只迭代节点名是 foo的节点
for (Iterator<Element> it = root.elementIterator("foo"); it.hasNext();) {
Element foo = it.next();
System.out.println(foo.getName());
}
System.out.println("我是分割线------------- root.attributeIterator()");
// 迭代root节点的所以属性
for (Iterator<Attribute> it = root.attributeIterator(); it.hasNext();) {
Attribute attribute = it.next();
System.out.println("name:" + attribute.getName() + "value:" + attribute.getValue());
}
}
快速循环
如果您必须使用大型XML文档树,那么为了提高性能,我们建议您使用快速循环方法,这样可以避免Iterator为每个循环创建对象的成本。例如
public void treeWalk(Document document) {
treeWalk(document.getRootElement());
}
public void treeWalk(Element element) {
for (int i = 0, size = element.nodeCount(); i < size; i++) {
Node node = element.node(i);
if (node instanceof Element) {
treeWalk((Element) node);
}
else {
// do something…
}
}
}
创建新的XML文档
public static Document createDocument() {
Document document = DocumentHelper.createDocument();
Element persons = document.addElement("person");
Element person = persons.addElement("person").addAttribute("id", "1");
person.addElement("name").addText("张三");
person.addElement("age").addText("18");
person.addElement("sex").addText("男");
Element person2 = persons.addElement("person").addAttribute("id", "2");
person2.addElement("name").addText("王五");
person2.addElement("age").addText("2");
person2.addElement("sex").addText("女");
return document;
}
将文档写入
这种方式有个缺点就是格式非常不美观,如果要美观的格式下面会讲
FileWriter out = new FileWriter("foo.xml");
createDocument().write(out);
out.close();
格式美观的
public static void write(Document document) throws IOException {
//设置输出流来生成一个xml文件
OutputStream os = new FileOutputStream("etoak2.xml");
// Format格式输出格式刷
OutputFormat format = OutputFormat.createPrettyPrint();
// 设置xml编码
format.setEncoding("utf-8");
// 写:传递两个参数一个为输出流表示生成xml文件在哪里
// 另一个参数表示设置xml的格式
XMLWriter xw = new XMLWriter(os, format);
// 讲内容写入文件中去
xw.write(document);
// 清空缓存关闭资源
xw.flush();
xw.close();
}
对XML文档进行增、删、改、查
原XML
<Persons>
<Person>
<Name>张三</Name>
<Age>19</Age>
<Sex>男</Sex>
</Person>
<Person>
<Name>李四</Name>
<Age>19</Age>
<Sex>女</Sex>
</Person>
</Persons>
添加一个节点
public static void add() throws Exception {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("foo.xml"));
Element root = document.getRootElement();
// 获取第一个人
Element firstPerson = (Element) root.elements("Person").get(0);
// 获取第一个节点下的所有节点
List<Element> list = firstPerson.elements(); // [姓名,年龄,性别]
// 创建一个节点
Element miaoshu = DocumentHelper.createElement("address");
miaoshu.setText("上海");
list.add(2, miaoshu);
// 格式化输出流,同时指定编码格式。也可以在FileOutputStream中指定。
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(new FileOutputStream("foo.xml"), format);
writer.write(document);
writer.close();
}
结果
<?xml version="1.0" encoding="utf-8"?>
<Persons>
<Person>
<Name>张三</Name>
<Age>19</Age>
<address>上海</address>
<Sex>男</Sex>
</Person>
<Person>
<Name>李四</Name>
<Age>19</Age>
<Sex>女</Sex>
</Person>
</Persons>
删除节点
// 删除节点
public static void delete() throws Exception {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("foo.xml"));
Element root = document.getRootElement();
// 获取第一个人
Element person = (Element) root.elements("Person").get(0);
Element address = (Element) person.element("address");
// 获取到address节点的父节点并删除miaoshu节点
address.getParent().remove(address);
// 格式化输出流,同时指定编码格式。也可以在FileOutputStream中指定。
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(new FileOutputStream("foo.xml"), format);
writer.write(document);
writer.close();
}
结果
<?xml version="1.0" encoding="utf-8"?>
<Persons>
<Person>
<Name>张三</Name>
<Age>19</Age>
<Sex>男</Sex>
</Person>
<Person>
<Name>李四</Name>
<Age>19</Age>
<Sex>女</Sex>
</Person>
</Persons>
修改
// 删除节点
public static void update() throws Exception {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("foo.xml"));
Element root = document.getRootElement();
// 获取第一个人
Element person = (Element) root.elements("Person").get(0);
Element name = (Element) person.element("Name");
// 修改姓名
name.setText("富贵");
//干脆添加一个属性玩玩
name.addAttribute("href", "www.baidu.com");
// 格式化输出流,同时指定编码格式。也可以在FileOutputStream中指定。
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(new FileOutputStream("foo.xml"), format);
writer.write(document);
writer.close();
}
结果
<?xml version="1.0" encoding="utf-8"?>
<Persons>
<Person>
<Name href="www.baidu.com">富贵</Name>
<Age>19</Age>
<Sex>男</Sex>
</Person>
<Person>
<Name>李四</Name>
<Age>19</Age>
<Sex>女</Sex>
</Person>
</Persons>
文档字符串相互转换
转为字符串
Document document = …;
String text = document.asXML();
字符串解析成Document对象
String text = "<person> <name>James</name> </person>";
Document document = DocumentHelper.parseText(text);