• JavaEE XML DOM解析之DOM4J


    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);
    			}
    
    
    		}
    }
    

      

  • 相关阅读:
    dp
    康拓展开
    MST + 树形 dp
    树上对抗搜索
    求树上任意一点所能到达的最远距离
    将一棵树变成一个环
    树形dp
    区间dp
    区间dp
    day07作业
  • 原文地址:https://www.cnblogs.com/ixenos/p/6280134.html
Copyright © 2020-2023  润新知