@liayun
2016-06-29T11:30:43.000000Z
字数 7887
阅读 4742
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();// 属性名nameAttribute 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/NamespaceContextSystem.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("登录成功!!");}}
这里我参考: