- Java XML 教程
- Java XML 首页
- Java XML 概述
- Java XML 解析器
- Java DOM 解析器
- Java DOM 解析器
- 解析 XML 文档
- 查询 XML 文档
- 创建 XML 文档
- 修改 XML 文档
- Java SAX 解析器
- Java SAX 解析器
- 解析 XML 文档
- 查询 XML 文档
- 创建 XML 文档
- 修改 XML 文档
- JDOM XML 解析器
- JDOM XML 解析器
- 解析 XML 文档
- 查询 XML 文档
- 创建 XML 文档
- 修改 XML 文档
- Java StAX 解析器
- Java StAX 解析器
- 解析 XML 文档
- 查询 XML 文档
- 创建 XML 文档
- 修改 XML 文档
- Java XPath 解析器
- Java XPath 解析器
- 解析 XML 文档
- 查询 XML 文档
- 创建 XML 文档
- 修改 XML 文档
- Java DOM4J 解析器
- Java DOM4J 解析器
- 解析 XML 文档
- 查询 XML 文档
- 创建 XML 文档
- 修改 XML 文档
- Java XML 有用资源
- Java XML - 问答
- Java XML - 快速指南
- Java XML - 有用资源
- Java XML - 讨论
Java DOM 解析器 - 解析 XML 文档
Java DOM 解析器是一个 Java API,用于解析任何 XML 文档。 使用提供的方法,我们可以使用 Java DOM 解析器检索根元素、子元素及其属性。
在本教程中,我们使用了getTagName()方法来检索元素的标签名称,使用getFirstChild()来检索元素的第一个子元素,并使用getTextContent()来获取元素的文本内容。
使用 Java DOM 解析器解析 XML
在讨论了 Java 中可用的各种 XML 解析器之后,现在让我们看看如何使用 DOM 解析器来解析 XML 文件。 我们使用parse()方法来解析 XML 文件。 在直接进入示例之前,让我们看看使用 Java DOM 解析器解析 XML 文档的步骤:
- 步骤 1:创建 DocumentBuilder 对象
- 步骤 2:读取 XML
- 步骤 3:解析 XML 文档
- 步骤 4:检索元素
步骤 1:创建 DocumentBuilder 对象
DocumentBuilderFactory 是一个工厂 API,通过创建 DOM 树来获取用于解析 XML 文档的解析器。 它具有 'newDocumentBuilder()' 方法,该方法创建 'DocumentBuilder' 类的实例。 此 DocumentBuilder 类用于获取流、文件、URL 和 SAX InputSource 形式的输入。
DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = factory.newDocumentBuilder();
步骤 2:读取 XML
输入可以是文件类型或流类型。 要输入 XML 文件,请创建一个文件对象并将文件路径作为参数传递。
File xmlFile = new File("input.xml");
为了以流的形式获取输入,我们使用了 StringBuilder 类并附加了输入字符串,然后将其转换为字节。 将获得的 ByteArrayInputStream 作为输入提供给文档。
StringBuilder xmlBuilder = new StringBuilder(); xmlBuilder.append("<?xml version="1.0"?> <rootElement></rootElement>"); ByteArrayInputStream input = new ByteArrayInputStream( xmlBuilder.toString().getBytes("UTF-8"));
步骤 3:解析 XML 文档
在上述步骤中创建的 DocumentBuilder 用于解析输入 XML 文件。 它包含一个名为 parse() 的方法,该方法接受文件或输入流作为参数并返回 DOM Document 对象。 如果给定的文件或输入流为 NULL,则此方法将抛出 IllegalArgumentException。
Document xmldoc = docBuilder.parse(input);
步骤 4:检索元素
org.w3c.dom.包的 Node 和 Element 接口提供各种方法来从 XML 文档中检索有关元素的所需信息。 此信息包括元素的名称、文本内容、属性及其值。 我们有很多 DOM 接口和方法可以获取此信息。
检索根元素名称
XML 文档包含许多元素。 在 Java 中,XML/HTML 文档由名为Element的接口表示。 此接口提供各种方法来检索、添加和修改 XML/HTML 文档的内容。
我们可以使用 Element 接口的getTagName()方法检索根元素的名称。 它以字符串的形式返回根元素的名称。
由于 Element 是一个接口,因此要创建其对象,我们需要使用getDocumentElement()方法。 此方法检索并以对象的形式返回根元素。
示例
在下面的示例中,我们使用 StringBuilder 类传递了一个只有一个根元素 'college' 的简单 XML 文档。 然后,我们检索它并打印到控制台。
import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import java.io.ByteArrayInputStream; import javax.xml.parsers.DocumentBuilder; public class RetrieveRootElementName { public static void main(String[] args) { try { //Creating a DocumentBuilder Object DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = factory.newDocumentBuilder(); //Reading the XML StringBuilder xmlBuilder = new StringBuilder(); xmlBuilder.append("<college></college>"); //Parsing the XML Document ByteArrayInputStream input = new ByteArrayInputStream(xmlBuilder.toString().getBytes("UTF-8")); Document xmldoc = docBuilder.parse(input); //Retrieving the Root Element Name Element element = xmldoc.getDocumentElement(); System.out.println("Root element name is "+element.getTagName()); } catch (Exception e) { e.printStackTrace(); } } }
输出
元素名称“college”显示在输出屏幕上,如下所示:
Root element name is college
解析 XML 中的单个子元素
我们可以解析根元素内只有一个元素的简单 XML 文档。 到目前为止,我们已经看到了如何检索根元素。 现在,让我们看看如何获取根元素内的子元素。
由于我们只有一个子元素,因此我们使用getFirstChild()方法来检索它。 此方法与根元素一起使用以获取其第一个子元素。 它以 Node 对象的形式返回子节点。
检索子节点后,使用getNodeName()方法获取节点的名称。 它以字符串的形式返回节点名称。
要获取文本内容,我们使用getTextContent()方法。 它以字符串的形式返回文本内容。
示例
让我们看看下面的示例,其中我们有一个根元素和一个子元素。 这里,“college”是根元素,其中“department”作为子元素。“department”元素具有文本内容“Computer Science”。 我们正在检索子元素的名称和文本内容。
import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import java.io.ByteArrayInputStream; import javax.xml.parsers.DocumentBuilder; public class SingleSubElement { public static void main(String[] args) { try { //Creating a DocumentBuilder Object DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = factory.newDocumentBuilder(); //Reading the XML StringBuilder xmlBuilder = new StringBuilder(); xmlBuilder.append("<college><department>Computer Science</department></college>"); //Parsing the XML Document ByteArrayInputStream input = new ByteArrayInputStream(xmlBuilder.toString().getBytes("UTF-8")); Document xmldoc = docBuilder.parse(input); //Retrieving the Root Element Element element = xmldoc.getDocumentElement(); //Retrieving the Child Node Node childNode = element.getFirstChild(); String childNodeName = childNode.getNodeName(); System.out.println("Sub Element name : " + childNodeName); //Retrieving Text Content of the Child Node "+ childNodeName); System.out.println("Text content of Sub Element : "+childNode.getTextContent()); } catch (Exception e) { e.printStackTrace(); } } }
输出窗口显示子元素名称和文本内容。
Sub Element name : department Text content of Sub Element : Computer Science
解析 XML 中的多个元素
要解析具有多个元素的 XML 文档,我们需要使用循环。getChildNodes()方法检索元素的所有子节点并将其作为 NodeList 返回。 我们需要遍历获得的 NodeList 的所有元素,并像在前面几节中那样检索每个元素的所需信息。
示例
现在,让我们向 XML 文件 (**multipleElements.xml**) 添加另外两个部门。 让我们尝试检索所有部门名称和员工人数。
<college> <department> <name>Computer Science</name> <staffCount>20</staffCount> </department> <department> <name>Electrical and Electronics</name> <staffCount>23</staffCount> </department> <department> <name>Mechanical</name> <staffCount>15</staffCount> </department> </college>
在下面的程序中,我们将部门元素列表检索到 NodeList 中,并迭代所有部门以获取部门名称和员工人数。
import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.w3c.dom.Node; import org.w3c.dom.Element; public class MultipleElementsXmlParsing { public static void main(String[] args) { try { //Input the XML file File inputXmlFile = new File("src/multipleElements.xml"); //creating DocumentBuilder DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = dbFactory.newDocumentBuilder(); Document xmldoc = docBuilder.parse(inputXmlFile); //Retrieving the Root Element Element element = xmldoc.getDocumentElement(); System.out.println("Root element name is "+element.getTagName()); //Getting the child elements List NodeList nList = element.getChildNodes(); //Iterating through all the child elements of the root for (int temp = 0; temp < nList.getLength(); temp++) { Node nNode = nList.item(temp); System.out.println("\nCurrent Element :" + nNode.getNodeName()); if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode; System.out.println("Name of the department : " + eElement.getElementsByTagName("name").item(0).getTextContent()); System.out.println("Staff Count of the department : " + eElement.getElementsByTagName("staffCount").item(0).getTextContent()); } } } catch (Exception e) { e.printStackTrace(); } } }
显示所有三个部门及其名称和员工人数。
Root element :college Current Element :department Name of the department : Computer Science Staff Count of the department : 20 Current Element :department Name of the department : Electrical and Electronics Staff Count of the department : 23 Current Element :department Name of the department : Mechanical Staff Count of the department : 15
解析 XML 中的属性
XML 元素可以具有属性,这些属性可以使用getAttribute()方法检索。 此方法将属性名称作为参数,并将相应的属性值作为字符串返回。如果指定的属性名称没有属性值或默认值,则返回空字符串。
示例
现在,让我们向“**attributesParsing.xml**”文件中的所有部门元素添加一个属性“deptcode”。
<?xml version = "1.0"?> <college> <department deptcode = "DEP_CS23"> <name>Computer Science</name> <staffCount>20</staffCount> </department> <department deptcode = "DEP_EC34"> <name>Electrical and Electronics</name> <staffCount>23</staffCount> </department> <department deptcode = "DEP_MC89"> <name>Mechanical</name> <staffCount>15</staffCount> </department> </college>
在下面的程序中,我们正在检索每个部门的 deptcode、名称和员工人数。
import java.io.File; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.w3c.dom.Node; import org.w3c.dom.Element; public class AttributesXmlParsing { public static void main(String[] args) { try { //Input the XML file File inputXmlFile = new File("attributesParsing.xml"); //creating DocumentBuilder DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = dbFactory.newDocumentBuilder(); Document xmldoc = docBuilder.parse(inputXmlFile); //Getting the root element System.out.println("Root element :" + xmldoc.getDocumentElement().getNodeName()); NodeList nList = xmldoc.getElementsByTagName("department"); //Iterating through all the child elements of the root for (int temp = 0; temp < nList.getLength(); temp++) { Node nNode = nList.item(temp); System.out.println("\nCurrent Element :" + nNode.getNodeName()); if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode; System.out.println("Department Code : " + eElement.getAttribute("deptcode")); System.out.println("Name of the department : " + eElement.getElementsByTagName("name").item(0).getTextContent()); System.out.println("Staff Count of the department : " + eElement.getElementsByTagName("staffCount").item(0).getTextContent()); } } } catch (Exception e) { e.printStackTrace(); } } }
显示三个部门及其相应的部门代码、名称和员工人数。
Root element :college Current Element :department Department Code : DEP_CS23 Name of the department : Computer Science Staff Count of the department : 20 Current Element :department Department Code : DEP_EC34 Name of the department : Electrical and Electronics Staff Count of the department : 23 Current Element :department Department Code : DEP_MC89 Name of the department : Mechanical Staff Count of the department : 15