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 ❤️
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: DOM4J是一个Java库,它提供了一种处理XML文档的方式,使得开发人员可以轻松地读取、创建和修改XML文档。DOM4J基于W3C DOM规范,并提供了一些额外的功能和改进,使其更加灵活和易于使用。 在Java中使用DOM4J主要涉及以下几个步骤: 1.导入DOM4J库:在Java代码中导入DOM4J库,可以通过添加以下Maven依赖项或下载jar包来实现: ```xml <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency> ``` 2.创建XML解析器:在Java代码中,使用DOM4J创建一个XML解析器对象,以便可以解析XML文档。以下代码演示如何创建一个XML解析器: ```java SAXReader reader = new SAXReader(); Document document = reader.read(new File("example.xml")); ``` 3.获取根元素:在Java代码中,使用DOM4J获取XML文档的根元素。以下代码演示如何获取根元素: ```java Element root = document.getRootElement(); ``` 4.遍历XML元素:在Java代码中,使用DOM4J遍历XML文档中的所有元素。以下代码演示如何遍历XML元素: ```java List<Element> elements = root.elements(); for (Element element : elements) { // 处理XML元素 } ``` 5.获取XML元素的属性:在Java代码中,使用DOM4J获取XML元素的属性。以下代码演示如何获取XML元素的属性: ```java Attribute attribute = element.attribute("name"); String value = attribute.getValue(); ``` 6.创建XML元素:在Java代码中,使用DOM4J创建一个新的XML元素。以下代码演示如何创建一个XML元素: ```java Element newElement = DocumentHelper.createElement("newElement"); newElement.addAttribute("name", "value"); ``` 总的来说,DOM4J提供了一种简单而强大的方式来处理XML文档,使得开发人员可以轻松地读取、创建和修改XML文档。 ### 回答2: DOM4J是一个用于处理XML文档的Java开源库,它提供了一个简单而直观的API来解析、创建和操作XML文件。使用DOM4J的步骤如下: 1. 首先,需要从DOM4J的官方网站(http://dom4j.github.io)下载并导入DOM4J的库文件,将其添加到Java项目的类路径中。 2. 导入DOM4J的包:在Java代码中,需要添加以下导入语句来引入DOM4J的相关类: import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; 3. 创建SAXReader对象:SAXReader类是DOM4J的入口类,用于读取XML文件并生成一个Document对象。可以通过以下代码创建一个SAXReader对象: SAXReader reader = new SAXReader(); 4. 读取XML文件:使用SAXReader对象的read()方法可以读取指定路径下的XML文件,并将其转换为一个Document对象,如下所示: Document document = reader.read("path/to/xml/file.xml"); 5. 操作XML文档:通过Document对象可以对XML文档进行操作。可以使用以下方法来获取根元素、所有子元素、指定名称的子元素等: - 获取根元素:Element rootElement = document.getRootElement(); - 获取所有子元素:List<Element> elements = rootElement.elements(); - 获取指定名称的子元素:Element element = rootElement.element("elementName"); 6. 对XML元素进行操作:可以使用Element对象的方法来获取元素的属性、文本内容,以及添加子元素、编辑属性等: - 获取属性:String attributeValue = element.attributeValue("attributeName"); - 获取文本内容:String text = element.getText(); - 添加子元素:Element childElement = element.addElement("childElementName"); - 编辑属性:element.addAttribute("attributeName", "attributeValue"); 7. 将修改后的XML文档保存到文件:可以使用XMLWriter类将修改后的Document对象保存为XML文件。可以通过以下代码实现: import org.dom4j.io.XMLWriter; import java.io.FileWriter; XMLWriter writer = new XMLWriter(new FileWriter("path/to/output/file.xml")); writer.write(document); writer.close(); 上述步骤简要介绍了如何使用DOM4J库来处理XML文档。通过熟悉DOM4J的API,可以更灵活和高效地读取、创建和修改XML文档。 ### 回答3: 使用DOM4J库处理XML文档的Java代码如下: 首先,需要导入dom4j库和相关的包: ```java import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.Node; import java.io.File; ``` 然后,可以使用DOM4J库创建一个新的XML文档: ```java // 创建一个空的XML文档 Document document = DocumentHelper.createDocument(); // 添加根元素 Element root = document.addElement("root"); // 添加子元素 Element child = root.addElement("child"); child.setText("Hello, World!"); // 保存到文件 document.write(new File("example.xml")); ``` 如果要解析现有的XML文档,可以使用DOM4J库的解析功能: ```java // 从文件中加载XML文档 File file = new File("example.xml"); Document document = DocumentHelper.parseText(file); // 获取根元素 Element root = document.getRootElement(); // 获取指定的子元素 Element child = root.element("child"); // 获取子元素的文本内容 String text = child.getText(); System.out.println(text); // 输出:Hello, World! ``` 还可以使用XPath表达式来检索XML文档中的特定元素或节点: ```java // 使用XPath检索特定元素 List<Node> nodes = document.selectNodes("//root/child"); for (Node node : nodes) { String text = node.getText(); System.out.println(text); } ``` 以上是使用DOM4J库进行XML文档的创建、解析和检索的基本示例。DOM4J库还提供了许多其他功能,如修改、删除和添加元素等操作,可以根据具体需求来使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JOEL-T99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值