JAVA(十九)Dom4j

JAVA(十九)Dom4jDOM4J介绍DOM4J是dom4j.org出品的一个开源的XML解析包。DOM4J应用于Java平台,采用lJava集合框架并完全支持DOM、SAX和JAXP。DOM4J使用非常简单。只要了解基本的XML-DOM模型,就能使用。Dom:把一个文档作为一个对象。DOM4J最大的特点是使用大量的接口,他的主要接口都在org.dom4j里面定义。接口名定义Atribute定义了XML的属性Branch指能够包含字节点的节点。如XML元素(Element)和文档(Docum

JAVA(十九)Dom4j"

DOM4J介绍

DOM4J是dom4j.org出品的一个开源的XML解析包。DOM4J应用于Java平台,采用lJava集合框架并完全支持DOM、SAX和JAXP。

DOM4J使用非常简单。只要了解基本的XML-DOM模型,就能使用。

Dom:把一个文档作为一个对象。

DOM4J最大的特点是使用大量的接口,他的主要接口都在org.dom4j里面定义。

接口名 定义
Atribute 定义了XML的属性
Branch 指能够包含字节点的节点。如XML元素(Element)和文档(Document)定义了一个公共的行为
CDDATA 定义了XML CDATA区域
CharacterData 是一个标识接口,标识基于字符的节点。如CDATA、Comment、Text
Comment 定义了XML注释的行为
Document 定义了XML文档
DocumentType 定义了XML DOCTYPE声明
Element 定义了XML元素
ElementHandler 定义了Element对象的处理器
ElementPath 被ElementHandler使用,用于取得当前正在处理的路径层次信息
Entity 定义了XML Entity实例
Node 为dom4j中所有的XML节点定义了多态行为
NodeFilter 定义了在dom4j节点产生的一个滤镜或谓语的行为(predicate)
ProcessingInstruction 定义了XML处理指令
Text 定义; XML文本节点
Visitor 用于实现Visitor
XPath 在分析一个字符串后提供了一个XPath表达式

各接口的继承关系如下:

  • interface java.lang.Cloneable
    • interface org.dom4j.**Node
      • interface org.dom4j.Attribute
      • interface org.dom4j.Branch
      • interface org.dom4j.Document
      • interface org.dom4j.Element
      • interface org.dom4j.CharacterData
        • interface org.dom4j.CDATA
        • interface org.dom4j.Comment
        • interface org.dom4j.Text
      • interface org.dom4j.DocumentType
      • interface org.dom4j.Entity
      • interface org.dom4j.ProcessingInstruction

XML 文档操作

XML:是一种简单的基于文本的语言,它被设计为储存和运输以纯文本格式的数据,XML标签可以自己定义。

读取XML文档

读写XML额外拿的那个主要依赖于org.dom4j.io包,有DOMReaderSAXReader两种方式。因为利用了相同的接口,他们的调用方式是一样的。

public static Document load(String filename){ 
   
  Document doc = null;
  try{ 
   
    SAXReader reader = new SAXReader();
    doc = reader.read(new File(filename));
  }catch(Exception e){ 
   
    e.printStackTrace;
  }
  return doc;
}
public static Document load(URL url){ 
   
  Document doc = null;
  try{ 
   
    SAXReader reader = new SAXReader();
    doc = reader.read(url));
  }catch(Exception e){ 
   
    e.printStackTrace;
  }
  return doc;
}

读取指定的XML文件之后返回一个Document对象,这个对象代表了整个XML文档,用于各种Dom操作。执照XML文件头所定义的编码来转换。

获取根结点

根结点是XML分析的开始,任何XML分析工作哦度需要从 根开始。

SAXReader reader = new SAXReader();
Document doc = reader.read(new File("filename"));
//获取根节点
Element element = doc.getRootElement();

增删改查

增加节点

//实例:
public static void main(String[] args) throws Exception { 
   
		
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入添加书的简称:");
		String Jname = sc.next();
		System.out.println("请输入添加书的id:");
		String id = sc.next();
		System.out.println("请输入添加书的name:");
		String name = sc.next();
		
		//将xml文件转为Doc对象
		SAXReader reader = new SAXReader();
		Document doc = reader.read(new File("filename"));
		
		//获取根节点
		Element element = doc.getRootElement();
		
		//在根结点上添加新的book节点
		Element newbook = element.addElement("book");
		newbook.addAttribute("name", Jname);
		
		//在book节点中添加数据
		Element newid = newbook.addElement("id");
		newid.setText(id);
		
		Element newname = newbook.addElement("name");
		newname.setText(name);
		
		//保存
		try { 
   
			OutputFormat of =OutputFormat.createCompactFormat();
			of.setEncoding("uft-8");
			XMLWriter writer = new XMLWriter(new FileWriter(new File("filename")));
			writer.write(doc);
			writer.close();
		}catch(Exception e) { 
   
			e.printStackTrace();
		}
		sc.close();
	}

删除节点

//实例:
public static void main(String[] args) throws Exception{ 
   
		
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入需要删除的节点:");
		String findname = sc.next();
		
		//将XML文件转为Doc对象
		SAXReader reader = new SAXReader();
		Document doc = reader.read(new File("filename"));
		
		//获取根结点
		Element element = doc.getRootElement();
		Iterator<?> iterator = element.elementIterator();
		while(iterator.hasNext()) { 
   
			Element element1 = (Element) iterator.next();
			if(findname.equals(element1.attributeValue("name"))) { 
   
				Element ele = element1;
				ele.getParent().remove(ele);
			}
		}
		//保存
		try { 
   
			OutputFormat of = OutputFormat.createPrettyPrint();
			of.setEncoding("utf-8");
			XMLWriter writer = new XMLWriter(new FileWriter("filename"),of);
			writer.write(doc);
			writer.close();
		}catch(Exception e) { 
   
			e.printStackTrace();
		}
		
		sc.close();
	}

更改节点

//实例
public static void main(String[] args) throws Exception { 
   
		
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入需要修改书的简称:");
		String findname = sc.next();
		
		//将XML文件转为doc对象
		SAXReader reader = new SAXReader();
		Document doc = reader.read(new File("filename"));
		
		//获取根结点
		Element element = doc.getRootElement();
		Iterator<?> iterator = element.elementIterator();
		while(iterator.hasNext()) { 
   
			//获取字节节点
			Element element1 = (Element)iterator.next();
			if(findname.equals(element1.attributeValue("name"))) { 
   
				//定义新的节点
				Element ele = element1;
				//创建用于存放数据的list集合
				@SuppressWarnings("unchecked")
				List<Element> list = ele.elements();
				if(list!=null) { 
   
					System.out.println("1.编号 2.书名");
					System.out.println(list.get(0)+" "+list.get(1));
				}else { 
   
					System.out.println("查无此书"+findname);
				}
				//查到相应书籍
				System.out.println("请输入需要修改的序号");
				int num = sc.nextInt();
				if(num==1) { 
   
					System.out.println("请输入新的id:");
					list.get(0).setText(sc.next());
				}else { 
   
					System.out.println("请输入新的name:");
					list.get(1).setText(sc.next());
				}
			}
		}
		//保存
		try { 
   
			OutputFormat of = OutputFormat.createPrettyPrint();
			of.setEncoding("utf-8");
			XMLWriter writer;
			writer = new XMLWriter(new FileWriter("filename"));
			writer.write(doc);
			writer.close();
		}catch(Exception e) { 
   
			e.printStackTrace();
		}
		sc.close();
	}

查看节点

//实例
public static void main(String[] args) throws Exception { 
   
//定义list集合用来存储数据
		ArrayList<Book> bookslist = new ArrayList<Book>();
		
		//将XML文件封装为doc对象
		SAXReader reader = new SAXReader();
		Document doc = reader.read(new File("filename"));//此处将抛出异常
		
		//获取doc对象的字节点
		Element element = doc.getRootElement();
		//迭代器
		Iterator<?> iterator = element.elementIterator();
		while(iterator.hasNext()) { 
   
			//获取字节点
			Element element1 = (Element)iterator.next();
			Book book = new Book();
			Iterator<?> iterator1 = element1.elementIterator();
			while(iterator1.hasNext()) { 
   
				Element element2 = (Element)iterator1.next();
				//获取字节点的相关信息
				if("id".equals(element2.getName())) { 
   
					//get.Text():获取相关数据,此处需要转型
					book.setId(Integer.parseInt(element2.getText()));
				}else if("name".equals(element2.getName())) { 
   
					book.setName(element2.getText());
				}
			}bookslist.add(book);
		}
  	//遍历
		for(Book book : bookslist) { 
   
			System.out.println(book.getId()+" "+book.getName());
		}
	}

Document对象相关

  • 读取XML文件,获取Document对象

    SAXReader reader = new SAXReader();
    Document doc = new reader.read(new File("filename"))
    
  • 解析XML形式的文本,得到document对象

    String text = "<members></members>"
    Document doc =DocumentHelper.praseText(text);
    
  • 主动创建document对象

    Document doc = DocumentHelper.createDocument();
    Element root = document.addElement("members");
    

节点相关

  • 获取文档的根节点

    Element rootele = document.gerRootElement();
    
  • 获得某节点的单个子节点

    Element memberele = root.element("member");
    
  • 取得节点的文字

    String text = memberele.getText();
    //取得根结点下的name节点的文字
    String text = root.elementText("name");
    
  • 取得某节点下指定名称的所有节点并进行遍历

    List nodes = rootele.elements("member");
    for(Iterator it = nodes.iterator(); it.hasNext();){ 
         
      Element ele = (Element)it.next();
    }
    
  • 对某节点下的所有子节点进行遍历

    for(Iterator it = root.elementIterator(); it.hasNext();){ 
         
      Element elemetn = (Element) it.next();
      //do something
    }
    
  • 某节点下添加子节点

    Element ageele = newMemberEle.addElement("age";)
    
  • 设置节点文字

    ageele.setText("12");
    
  • 删除某节点

    parentele.remove(childele);//parentele是父节点,childele是呆删的子节点
    
  • 添加一个CDATA节点

    Element contentele = infoele.addElement("contect");
    contectele.addCDARA(diary.gerContect());
    

属性相关

  • 取得节点的指定的属性

    Element root = document.getRootElement();
    Attribute attribute = root.attribute("size");
    
  • 取得属性的文字

    String text = attribute.getText();
    //获取根结点下name子节点的firstname属性的值
    String text2 = root.element("name").attributeValue("firstname");
    
  • 遍历某节点的所有属性

    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");   
    
  • 设置属性的文字

    Attribute attribute=root.attribute("name");      
    attribute.setText("sitinspring");      
    
  • 删除某属性

    Attribute attribute=root.attribute("size");// 属性名name 
    root.remove(attribute);   
    

将文档写入XML文件

  • 文档中全为英文,不设置编码,直接写入

    XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));      
    writer.write(document);      
    writer.close();  
    
  • 文档中含有中文,设置编码格式再写入

    OutputFormat format = OutputFormat.createPrettyPrint();
    format.setEncoding("GBK");    // 指定XML编码
    XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format);
    writer.write(document);
    writer.close();
    

字符串与XML的转换

  • 字符串与XML的转换

    String text = "<members> <member>sitinspring</member> </members>";      
    Document document = DocumentHelper.parseText(text);   
    
  • 将文档或节点的XML转化为字符串

    AXReader reader = new SAXReader();
    Document document = reader.read(new File("input.xml"));
    Element root=document.getRootElement();
    String docXmlText=document.asXML();
    String rootXmlText=root.asXML();
    Element memberElm=root.element("member");
    String memberXmlText=memberElm.asXML();
    

     

DOM4J的类和接口

类:SAXReader

当解析到path指定的路径时,将调用参数handler指定的处理器。正对不同的节点可以添加多个handler实例。或者调用默认的HandlersetDefaultJandler(ElementHandler handler);

接口:ElementHandler

该方法在解析到元素的开始、结束标签时被调用。

接口:ElementPath

该方法与SAXReader类中的addHandler()方法的作用相同。路径path可以是绝对路径(路径以/开头),也可以是相对路径(假设是当前路径的子节点路径)。

移除指定路径上的ElementHandler实例。路径可以是相对路径,也可以是绝对路径。

该方法得到当前节点的路径,该方法返回的是完整的绝对路径。

Element类

方法名 定义
getText() 元素所罕有的text内容,如果内容为空则返回一个空字符串而不是null
attributeValue() 元素的某个指定属性所含有的值
elementIterator() 元素属性的iterator,其中每个元素都是Element

DocumentHelper类

DocumentHelper是用来生成XML文档的工厂类

 


❤️ END ❤️

今天的文章JAVA(十九)Dom4j分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/30475.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注