1.获取元素:
@Test //获取第一个user节点
public void readDemo() throws Exception{
//获取DOM
SAXReader sax = new SAXReader();
Document dom = sax.read("./xml/user.xml");
//获取根节点
/**
* ELement中有三种方法获得元素:
* element(name)//查单
* elements(name) //查全,返回一个list
* elementIterator()//迭代,返回一个Iterator
*/
Element root = dom.getRootElement();
Element eUser = root.element("user");
//获取属性
String id1=eUser.attributeValue("id");
String id2=eUser.attribute("id").getValue();
System.out.println("id1:"+id1+" id2:"+id2);
//获取子元素
String name=eUser.element("name").getText(); //法一
String age=eUser.elementText("age"); //法二
System.out.println("name:"+name+" age:"+age);
}
@Test //遍历用户,获取所有user的信息
public void iteratorDemo() throws Exception{
SAXReader sax=new SAXReader();
Document dom=sax.read("./xml/user.xml");
Element root=dom.getRootElement();
// Iterator<Element> it = root.elementIterator(); //遍历所有儿子节点
Iterator<Element> it = root.elementIterator("user"); //遍历所有儿子节点
while(it.hasNext()){
Element element=it.next();
String id=element.attributeValue("id");
String name=element.elementText("name");
String age=element.elementText("age");
System.out.println(id+","+name+","+age);
}
}
2.对文档进行持久化:
@Test //给文档添加一个aa元素--持久化
public void addDemo() throws Exception{
Document dom=new SAXReader().read("./xml/user.xml");
Element root=dom.getRootElement();
//给root添加子元素aa
Element aa = root.addElement("aa");
//给aa添加属性
aa.addAttribute("id", "aa1001");
//给aa添加子元素:name
Element eA_Name = aa.addElement("name");
eA_Name.setText("aaaaaa");
//给aa添加子元素:age
aa.addElement("age").setText("991");
//持久化
//1.dom.write(FileWrite())
// Writer w=new FileWriter("./xml/user.xml");
// dom.write(w); //字符流必须刷缓存
// w.close();
//2.XMLWriter类中的writer(dom)
// FileWriter fw=new FileWriter("./xml/user.xml");
// XMLWriter w=new XMLWriter(fw);
// w.write(dom);
// w.close();
//3.以指定字符编码写
OutputFormat format=OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
//把格式加入到XMLWriter中
XMLWriter w=new XMLWriter(new FileWriter("./xml/user.xml"),format);
w.write(dom);
w.close();
}
3.删除元素:
@Test //删除根节点下的最后一个子元素
public void delDemo() throws Exception{
Document dom=new SAXReader().read("./xml/user.xml");
Element root=dom.getRootElement();
List<Element> list=root.elements();
Element eLast=list.get(list.size()-1);
eLast.getParent().remove(eLast);
//持久化
XMLWriter w=new XMLWriter(new FileWriter("./xml/user.xml"));
w.write(dom);
w.close();
}
4.修改元素:
@Test //更改文档根节点下最后一个子元素的信息
public void updateDemo() throws Exception{
Document dom=new SAXReader().read("./xml/user.xml");
Element root=dom.getRootElement();
//先找到元素
List<Element> list = root.elements();
Element eLast=list.get(list.size()-1);
//在对元素进行设置值
//若属性或元素存在则修改,否则为添加
eLast.addAttribute("id", "修改后的id");
Element name = eLast.element("name");
name.setText("修改后的name");
//持久化
XMLWriter w=new XMLWriter(new FileWriter("./xml/user.xml"));
w.write(dom);
w.close();
}
5.添加元素:
//从零开始创建一个xml文档:aa.xml
@Test
public void createNewXMLDemo() throws Exception{
Document dom=DocumentHelper.createDocument();
Element root=dom.addElement("cities");
Element e=root.addElement("city");
e.addAttribute("id", "c1001");
Element name = e.addElement("name");
name.setText("邵阳");
//持久化
XMLWriter w=new XMLWriter(new FileWriter("./xml/aa.xml"));
w.write(dom);
w.close();
}
6.xpath
xpath技术:详细语法参考文档Xpath_simples.pdf
/** dom不支持,dom4j支持
* Xpath的基本套路:通过dom调用Node接口中的如下方法(参数采用xpath语法)进行节点选择
* 相当于正则表达式
* 1)selectNodes(xpathExpression)--List
* 2)selectObject(xpathExpression)--Object
* 3)selectSingleNode(xpathExpression)--Node
*
* 注意一个细节:由于上面的几个方法是Node接口中的,因此普通的Element对象也能调用
* 但是其含义跟dom调用一样的 , 也就是说 使用一个 x.selectNodes(xpathExpression) 跟dom.selectNodes(xpathExpression)是一样的
* 都是查找整颗树下的元素
*/
@Test
public void xpathDemo() throws Exception{
Document dom=new SAXReader().read("./xml/user.xml");
//获取所有的name元素
// String xpath="//name";
// String xpath="//user/name";//获取所有user下的name儿子元素 只能是一个/
// String xpath="//user//name";//获取所有user的子孙后代的name元素
String xpath="/users/name";
List<Element> list = dom.selectNodes(xpath);
for(Element e:list){
System.out.println(e.getText());
}
}
@Test
public void xpathDemo2() throws Exception{
Document dom=new SAXReader().read("./xml/user.xml");
// String xpath="//user[@name][@pwd]"; //查找同时具有name和pwd属性的user节点
String xpath="//user[@name='dragon'][@pwd='1234']"; //查找同时具有name为"dragon"和pwd""属性的user节点
List<Element> list = dom.selectNodes(xpath);
for(Element e:list){
System.out.println(e.getText());
}
}
Xpath_simples.pdf在我的资源中可以找到。