DOM解析之DOM4J
@author ixenos
DOM4J常用API
读取xml文档:
Document doc = new SAXReader().read("xml文件");
节点:
nodeIterator(); 所有节点
标签:
element("名称") 指定名称的第一个子标签对象
elementIterator("名称"); 指定名称的所有子标签对象
elements(); 所有子标签对象
属性:
attributeValue(“名称”) 指定名称的属性值
attribute("名称") 指定名称的属性对象
getName() 属性名称
getValue() 属性值
atributeIterator() 所有属性对象(Iterator)
attributes() 所有属性对象(List)
文本:
getText() 得到当前标签的文本
elementText("子标签名称") 得到子标签的文本
SAXReader reader = new SAXReader();
//Document对象也看成根节点
Document doc = reader.read(File file);
//迭代当前节点下的子节点/也可foreach
Iterator itr = doc.nodeIterator();
While(itr.hasNext()){ Node node = itr.next(); }
//得到根节点
Element rootElem = doc.getRootElement();
//得到当前标签下指定名称的第一个子标签
Element contactElem = rootElem.element("contact");
//得到当前标签下的的所有子标签
List<Element> list = rootElem.elements();
//获取更深层次的标签(方法只能一层层地获取),XPath!!!当然这只获得第一个
Element nameElem = doc.getRootElement().element("contact").element("name");
//得到指定名称的属性值
String idValue = contactElem.attributeValue("id");
//为标签添加属性和属性值。根据XML约定,若value为null,则attr属性不存在,这可用于删除属性
Element newElement = element.addAttribute(String attr, String value)
//得到指定属性名称的属性对象
Attribute idAttr = contactElem.attribute("id");
//得到所有属性对象,返回LIst集合
List<Attribute> list = contactElem.attributes();
//得到所有属性对象,返回迭代器
Iterator<Attribute> it = contactElem.attributeIterator();
while(it.hasNext()){ Attribute attr = it.next(); }
//得到当前标签夹着的的Text内容,注意空格和换行也是Text
String content = doc.getRootElement().getText();
//获取文本(先获取标签,再获取标签上的文本)
Element nameELem =doc.getRootElement().element("contact").element("name");
//然后得到文本
String text = nameELem.getText();
System.out.println(text);
//直接得到指定子标签名的文本内容,直接得到phone标签的Text
String text2 = doc.getRootElement().element("contact").elementText("phone");
1、最基本的:Document对象指代整个XML文件
// 读取XML文档,返回Document对象
SAXReader reader = new SAXReader();
// 读取xml文档,返回Document对象
Document doc = reader.read(new File("03.contact.xml"));
2、Document对象的nodeIterator方法迭代下一级,判断是否是Element对象,下一级再用nodeIterator迭代下一级,双重循环,或者用递归,就能遍历所有标签节点
// nodeiterator:得到当前标签节点下的所有子节点对象
Iterator<Node> it = doc.nodeIterator();
while (it.hasNext()) {
Node node = it.next();
String name = node.getName();
System.out.println(name);
// 继续取出下面的子节点
// 只有标签节点才有子节点
// 所以判断当前标签是否标签节点
if (node instanceof Element) {
Element elem = (Element) node;
Iterator<Node> it2 = elem.nodeIterator();
while (it2.hasNext()) {
Node node2 = it2.next();
System.out.println(node2.getName());
}
}
}
DOM4J完整读取XML内容示例
1 import java.io.File; 2 import java.util.Iterator; 3 import java.util.List; 4 5 import org.dom4j.Attribute; 6 import org.dom4j.Document; 7 import org.dom4j.Element; 8 import org.dom4j.Node; 9 import org.dom4j.Text; 10 import org.dom4j.io.SAXReader; 11 import org.junit.Test; 12 /** 13 * 练习-完整读取xml文档内容 14 * @author APPle 15 * 16 */ 17 public class Demo3 { 18 19 @Test 20 public void test() throws Exception{ 21 //读取xml文档 22 SAXReader reader = new SAXReader(); 23 Document doc = 24 reader.read(new File("./src/contact.xml")); 25 26 //读取根标签 27 Element rootELem = doc.getRootElement(); 28 29 StringBuffer sb = new StringBuffer(); 30 31 getChildNodes(rootELem,sb); 32 33 System.out.println(sb.toString()); 34 35 } 36 37 /** 38 * 获取当前标签的所有子标签 39 */ 40 private void getChildNodes(Element elem,StringBuffer sb){ 41 //System.out.println(elem.getName()); 42 43 //开始标签 44 sb.append("<"+elem.getName()); 45 46 //得到标签的属性列表 47 //为什么属性的组装放在循环体外呢?因为此时循环体是获得element根节点的子节点,所以不能组装根标签的属性,只能留待下面的递归配合迭代来曲线救国 48 List<Attribute> attrs = elem.attributes(); 49 if(attrs!=null){ 50 for (Attribute attr : attrs) { 51 //System.out.println(attr.getName()+"="+attr.getValue()); 52 //属性值双引号使用转义字符 53 sb.append(" "+attr.getName()+"=""+attr.getValue()+"""); 54 } 55 } 56 sb.append(">"); 57 58 //得到文本 59 //String content = elem.getText(); 60 //System.out.println(content); 61 Iterator<Node> it = elem.nodeIterator(); 62 while(it.hasNext()){ 63 Node node = it.next(); 64 65 //标签 66 if(node instanceof Element){ 67 Element el = (Element)node; 68 getChildNodes(el,sb); 69 } 70 71 //文本 72 if(node instanceof Text){ 73 Text text = (Text)node; 74 sb.append(text.getText()); 75 } 76 } 77 78 //结束标签 79 sb.append("</"+elem.getName()+">"); 80 81 82 83 84 } 85 }
DOM4J用于封装XML中的对象时
package gz.itcast.a_dom4j_read; import java.io.File; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; /** * 把xml文档信息封装到对象中 * @author APPle * */ public class Demo4 { public static void main(String[] args) throws Exception{ List<Contact> list = new ArrayList<Contact>(); //读取xml,封装对象 SAXReader reader = new SAXReader(); Document doc = reader.read(new File("./src/contact.xml")); //读取contact标签 Iterator<Element> it = doc.getRootElement().elementIterator("contact"); while(it.hasNext()){ Element elem = it.next(); //创建Contact Contact contact = new Contact(); contact.setId(elem.attributeValue("id")); contact.setName(elem.elementText("name")); contact.setAge(elem.elementText("age")); contact.setPhone(elem.elementText("phone")); contact.setEmail(elem.elementText("email")); contact.setQq(elem.elementText("qq")); list.add(contact); } for (Contact contact : list) { System.out.println(contact); } } }