Java JDOM Document getDescendants() 方法



Java JDOM 的 getDescendants() 方法(Document 类的方法)检索 XML 文档的所有后代节点。我们可以过滤后代节点,只获取元素、只获取注释、获取注释或元素、获取具有特定名称或前缀的元素。

此方法返回一个 IteratorIterable 对象,该对象包含所有后代节点的列表(以 Content 对象的形式)。我们可以遍历 IteratorIterable 对象以访问每个 Content 对象。当在此方法上使用过滤时,它将返回指定过滤器的迭代器。例如,如果使用 Element 过滤器,则它将返回 Element 对象的迭代器。

语法

以下是 Java JDOM Document getDescendants() 方法的语法:

Document.getDescendants()
Document.getDescendants(filter)

参数

Java JDOM Document getDescendants() 方法不接受任何参数或接受单个参数。

filter − 表示过滤器对象。

返回值

Java getDescendants() 方法返回 XML 文档中所有后代节点的迭代器。

示例 1

让我们在下面的 collegeData.xml 文件上应用 Java JDOM Document getDescendants() 方法:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Information of xyz college (last updated 24-07-2024) -->
<college>
	<!-- All the three departments are listed -->
   <department id="101">
	  <!-- Here, name represents the name of the department -->
      <name>Computer Science</name>
      <staffCount>20</staffCount>
   </department>
   <department id="102">
      <name>Electrical and Electronics</name>
      <staffCount>23</staffCount>
   </department>
   <department id="103">
      <name>Mechanical</name>
      <staffCount>15</staffCount>
   </department>
</college>

下面的 getDescendants.java 程序在 collegeData.xml 文档上使用 Document 类的 getDescendants() 方法,并检索所有后代节点。

import java.io.File;
import java.util.Iterator;
import org.jdom2.Content;
import org.jdom2.Document;
import org.jdom2.input.SAXBuilder;

public class getDescendants {
   public static void main(String args[]) {
      try {
    	  
         //Creating a SAXBuilder Object
		 SAXBuilder saxBuilder = new SAXBuilder();		          
		 //Reading the XML
		 File inputFile = new File("collegeData.xml");			          
		 //Parsing the XML Document
		 Document doc = saxBuilder.build(inputFile);
		 
		 //Getting the descendants 
		 Iterator<Content> list = doc.getDescendants();
		 
		 //Iterating through the list
		 while(list.hasNext())
		    System.out.println(list.next()); 
		 
      } catch(Exception e) {
		  e.printStackTrace();
	  } 
   }
}

输出窗口显示所有后代节点(元素、文本内容和注释)。

[Comment: <!-- Information of xyz college (last updated 24-07-2024) -->]
[Element: <college/>]
[Text: 
	]
[Comment: <!-- All the three departments are listed -->]
[Text: 
   ]
[Element: <department/>]
[Text: 
	  ]
[Comment: <!-- Here, name represents the name of the department -->]
[Text: 
      ]
[Element: <name/>]
[Text: Computer Science]
[Text: 
      ]
[Element: <staffCount/>]
[Text: 20]
[Text: 
   ]
[Text: 
   ]
[Element: <department/>]
[Text: 
      ]
[Element: <name/>]
[Text: Electrical and Electronics]
[Text: 
      ]
[Element: <staffCount/>]
[Text: 23]
[Text: 
   ]
[Text: 
   ]
[Element: <department/>]
[Text: 
      ]
[Element: <name/>]
[Text: Mechanical]
[Text: 
      ]
[Element: <staffCount/>]
[Text: 15]
[Text: 
   ]
[Text: 
]

示例 2

Filters.elements() 方法返回与 Element 匹配的数据。使用此方法,可以获得 Element 过滤器并将其作为参数传递给 getDescendants(Filter<Element>) 方法。它只过滤后代节点中的元素,并返回 Element 对象的迭代器。

在下面的示例中,我们解析了 collegeData.xml 文件,并使用 while 循环遍历迭代器来打印元素。

import java.io.File;
import java.util.Iterator;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.filter.Filter;
import org.jdom2.filter.Filters;
import org.jdom2.input.SAXBuilder;

public class getDescElements {
   public static void main(String args[]) {
      try {
    	  
         //Creating the document from XML file
		 SAXBuilder saxBuilder = new SAXBuilder();
		 File inputFile = new File("collegeData.xml");
		 Document doc = saxBuilder.build(inputFile);
		 
		 //Getting the descendants of Element type only
		 Filter<Element> element_filter = Filters.element();
		 Iterator<Element> list = doc.getDescendants(element_filter);
		 
		 //Iterating through the list
		 while(list.hasNext())
		    System.out.println(list.next()); 
		 
      } catch(Exception e) {
		  e.printStackTrace();
	  } 
   }
}

输出窗口显示 XML 文档的所有元素名称。

[Element: <college/>]
[Element: <department/>]
[Element: <name/>]
[Element: <staffCount/>]
[Element: <department/>]
[Element: <name/>]
[Element: <staffCount/>]
[Element: <department/>]
[Element: <name/>]
[Element: <staffCount/>]

示例 3

通过将其构造函数中元素的名称作为字符串传递,创建 ElementFilter 对象。将获得的 ElementFilter 对象作为参数传递给 getDescendants(ElementFilter) 方法。它只过滤具有 ElementFilter 指定的元素名称的元素。

下面的示例使用上述方法获取名称为“staffCount”的元素。使用 while 循环迭代获得的 Element 迭代器并打印元素。

import java.io.File;
import java.util.Iterator;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.filter.ElementFilter;
import org.jdom2.input.SAXBuilder;

public class getDescSpecificElements {
   public static void main(String args[]) {
      try {
			    	  
         //Creating the document from XML file
		 SAXBuilder saxBuilder = new SAXBuilder();
		 File inputFile = new File("collegeData.xml");
		 Document doc = saxBuilder.build(inputFile);
			     
	     //Getting the descendants of Element with specific name 
	     ElementFilter filter = new ElementFilter("staffCount");
	     Iterator<Element> list = doc.getDescendants(filter);
	     while(list.hasNext())
		    System.out.println(list.next());     
      } catch(Exception e) {
		     e.printStackTrace();
      }
   }
}

输出窗口显示所有名称为“staffCount”的元素。

[Element: <staffCount/>]
[Element: <staffCount/>]
[Element: <staffCount/>]

示例 4

Filters.comments() 方法返回与 Comment 匹配的数据。使用此方法,可以获得 Comment 过滤器并将其作为参数传递给 getDescendants(Filter<Comment>) 方法。它只过滤后代节点中的注释,并返回 Comment 对象的迭代器。

在下面的程序中使用了上述方法来获取所有 Comment 对象作为迭代器。使用 while 循环迭代获得的迭代器,将其打印到控制台。

import java.io.File;
import java.util.Iterator;
import org.jdom2.Comment;
import org.jdom2.Document;
import org.jdom2.filter.Filter;
import org.jdom2.filter.Filters;
import org.jdom2.input.SAXBuilder;

public class getDescComments {
   public static void main(String args[]) {
      try {
    	  
         //Creating the document from XML file
		 SAXBuilder saxBuilder = new SAXBuilder();
		 File inputFile = new File("collegeData.xml");
		 Document doc = saxBuilder.build(inputFile);
		 
		 //Getting the descendants of Comment type only
		 Filter<Comment> comment_filter = Filters.comment();
		 Iterator<Comment> list = doc.getDescendants(comment_filter);
		 
		 //Iterating through the list
		 while(list.hasNext())
		    System.out.println(list.next()); 
		 
      } catch(Exception e) {
		  e.printStackTrace();
	  } 
   }
}

输出窗口显示文档中的所有注释。

[Comment: <!-- Information of xyz college (last updated 24-07-2024) -->]
[Comment: <!-- All the three departments are listed -->]
[Comment: <!-- Here, name represents the name of the department -->]
广告