@liayun
2016-06-29T19:30:43.000000Z
字数 7887
阅读 4502
JavaWeb
dom4j-1.6.1.zip
压缩包,解压开之后,发现几个目录和一个jar文件,jar文件是必须的文件,如图: 右键
→build path
→add to buildpath
。DOM4j中,获得Document对象的方式有三种:
读取XML文件,获得document对象。
创建解析器。
SAXReader reader = new SAXReader();
利用解析器读入xml文档。
Document document = reader.read(new File("src/book.xml"));
解析XML形式的文本,得到document对象。
String text = "<members></members>";
Document document = DocumentHelper.parseText(text);
主动创建document对象。
Document document = DocumentHelper.createDocument();
// 创建根节点
Element root = document.addElement("members");
获取文档的根节点。
Element root = document.getRootElement();
取得某个节点的子节点。
Element element=node.element("书名");
获取节点的名字。
node.getName();
设置节点的名字。
node.setName(String newName);
取得节点的文字。
String text=node.getText();
设置节点的文字。
node.setText("aaa");
取得某节点下所有名为“member”的子节点,并进行遍历。
List nodes = rootElm.elements("member");
for (Iterator it = nodes.iterator(); it.hasNext(); ) {
Element elm = (Element) it.next();
// do something
}
对某节点下的所有子节点进行遍历。
for(Iterator it=root.elementIterator(); it.hasNext(); ) {
Element element = (Element) it.next();
// do something
}
在某节点下添加子节点。
Element ageElm = newMemberElm.addElement("age");
删除某节点。
// childElm是待删除的节点,parentElm是其父节点
parentElm.remove(childElm);
添加一个CDATA节点。
Element contentElm = infoElm.addElement("content");
contentElm.addCDATA(diary.getContent());
取得某节点下的某属性。
Element root=document.getRootElement();
// 属性名name
Attribute attribute=root.attribute("name");
取得属性的文字。
String text=attribute.getText();
设置属性的文字。
attribute.setText("sitinspring");
删除某属性。
Element root=document.getRootElement();
Attribute attribute=root.attribute("name");
root.remove(attribute);
遍历某节点的所有属性。
Element root=document.getRootElement();
for(Iterator it=root.attributeIterator(); it.hasNext(); ) {
Attribute attribute = (Attribute) it.next();
String text=attribute.getText();
System.out.println(text);
}
设置某节点的属性和文字。
newMemberElm.addAttribute("name", "sitinspring");
得到插入位置的节点列表(list)。
List list = root.element("书").elements();
调用list.add(index, elemnent)
,由index决定element的插入位置。Element元素可以通过DocumentHelper对象得到。
Element aaa = DocumentHelper.createElement("aaa");
aaa.setText("aaa");
list.add(1, aaa);
// 更新document
将字符串转化为XML。
String text = "<members> <member>sitinspring</member></members>";
Document document = DocumentHelper.parseText(text);
将文档或节点的XML转化为字符串。
SAXReader reader = new SAXReader();
Document document = reader.read(new File("input.xml"));
Element root=document.getRootElement();
// 将文档的XML转化为字符串
String docXmlText=document.asXML();
// 将根节点的XML转化为字符串
String rootXmlText=root.asXML();
// 将根节点下的子节点memberElm的XML转化为字符串
Element memberElm=root.element("member");
String memberXmlText=memberElm.asXML();
例,有book.xml文档如下:
<?xml version="1.0" encoding="UTF-8"?>
<书架>
<书>
<书名>Java就业培训教程</书名>
<作者>张孝祥</作者>
<售价>109元</售价>
</书>
<书>
<书名 name="xxxx">JavaScript网页开发</书名>
<作者>黎活明</作者>
<售价>28.00元</售价>
</书>
</书架>
读取xml文档第二本书:<书名>JavaScript网页开发</书名>
。
public void read() throws Exception {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/book.xml"));
Element root = document.getRootElement();
Element book = (Element) root.elements("书").get(1);
String value = book.element("书名").getText();
System.out.println(value);
}
读取xml文档第二本书的属性值:<书名 name="xxxx">JavaScript网页开发</书名>
。
public void readAttr() throws Exception {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/book.xml"));
Element root = document.getRootElement();
Element book = (Element) root.elements("书").get(1);
/*
* 第一种方式,稍显麻烦
*/
// String value = book.element("书名").attribute("name").getValue();
/*
* 第二种方式,略简单
*/
String value = book.element("书名").attributeValue("name");
System.out.println(value);
}
在第一本书添加一个新的售价:<售价>209元</售价>
。
public void add() throws Exception {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/book.xml"));
Element book = document.getRootElement().element("书");
book.addElement("售价").setText("209元");
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8"); // 给格式化输出器指定一个码表,xml文档什么编码,格式化输出器就是什么编码
XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"), format);
writer.write(document);
writer.close();
}
添加之后,book.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<书架>
<书>
<书名>Java就业培训教程</书名>
<作者>张孝祥</作者>
<售价>109元</售价>
<售价>209元</售价>
</书>
<书>
<书名 name="xxxx">JavaScript网页开发</书名>
<作者>黎活明</作者>
<售价>28.00元</售价>
</书>
</书架>
在第一本书指定位置上添加一个新的售价:<售价>209元</售价>
原理:更改保存了所有孩子的list集合的顺序。
public void add2() throws Exception {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/book.xml"));
Element book = document.getRootElement().element("书");
List list = book.elements(); // [书名,作者,售价]——>[书名,作者,售价,售价]
Element price = DocumentHelper.createElement("售价");
price.setText("309元");
list.add(2, price);
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8"); // 给格式化输入器指定一个码表,xml文档什么编码,格式化输入器就是什么编码
XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"), format);
writer.write(document);
writer.close();
}
添加之后,book.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<书架>
<书>
<书名>Java就业培训教程</书名>
<作者>张孝祥</作者>
<售价>309元</售价>
<售价>109元</售价>
</书>
<书>
<书名 name="xxxx">JavaScript网页开发</书名>
<作者>黎活明</作者>
<售价>28.00元</售价>
</书>
</书架>
删除上面添加的售价节点。
public void delete() throws Exception {
// 得到代表文档的document对象
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/book.xml"));
Element price = document.getRootElement().element("书").element("售价");
price.getParent().remove(price);
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8"); // 给格式化输入器指定一个码表,xml文档什么编码,格式化输入器就是什么编码
XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"), format);
writer.write(document);
writer.close();
}
将第二本书的作者:“黎活明”修改为“活黎明”。
public void update() throws Exception {
// 得到代表文档的document对象
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/book.xml"));
Element book = (Element) document.getRootElement().elements("书").get(1);
book.element("作者").setText("活黎明");
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8"); // 给格式化输入器指定一个码表,xml文档什么编码,格式化输入器就是什么编码
XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"), format);
writer.write(document);
writer.close();
}
使用XPath可以快速精确定位指定的节点,以实现对XML文件的CRUD操作。
为了学习XPath语法,可去网上下载一个“XPath帮助文档”,以便于查看语法等详细信息,最好是那种有很多实例的那种。这里就不专门赘述了。
例1,有book.xml文档如下:
<?xml version="1.0" encoding="UTF-8"?>
<书架>
<书>
<书名>Java就业培训教程</书名>
<作者>张孝祥</作者>
<售价>109元</售价>
</书>
<书>
<书名 name="xxxx">JavaScript网页开发</书名>
<作者>黎活明</作者>
<售价>28.00元</售价>
</书>
</书架>
读取XML文件,获得document对象。
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/book.xml"));
查找<作者>张孝祥</作者>
元素,并将其文本内容显示出来。
String value = document.selectSingleNode("//作者").getText(); // 报异常:java.lang.NoClassDefFoundError: org/jaxen/NamespaceContext
System.out.println(value);
问题:此时会报异常java.lang.NoClassDefFoundError: org/jaxen/NamespaceContext,这是因为使用XPath解析xml文档时,dom4j-1.6.1.jar依赖的jar包(jaxen-1.1-beta-6.jar)没有导入进来,所以应当将jaxen-1.1-beta-6.jar包加到构建路径中来。
例2,有users.xml文档如下:
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user id="1" username="aaa" password="123" email="aaa@sina.com" />
<user id="2" username="bbb" password="123" email="bbb@sina.com" />
</users>
想要判断用户是否登录成功,应该怎么做?
解:
思路:查找users.xml文档中是否有和用户想匹配的用户名和密码。
public static void main(String[] args) throws DocumentException {
String username = "vvv";
String password = "123";
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/users.xml"));
// 检测xml文档中是否有匹配的用户名和密码
// 记住值一定要用''引起来
Node node = document.selectSingleNode("//user[@username='"+username+"' and @password='"+password+"']");
if(node == null) {
System.out.println("用户名或密码错误!!");
} else {
System.out.println("登录成功!!");
}
}
这里我参考: