本文概述
用Java读取XML文件与读取其他文件(如.docx和.txt)有很大不同, 因为XML文件包含标签之间的数据。 Java提供了许多解析XML文件的方法。 Java中有两个解析器, 用于解析XML文件:
- Java DOM解析器
- Java SAX解析器
Java DOM解析器
DOM API提供了用于读取和写入XML文件的类。我们可以使用DOM API创建, 删除, 修改和重新排列节点。 DOM解析器解析整个XML文件并在内存中创建DOM对象。它以树形结构对XML文件进行建模, 以便于遍历和操作。在DOM中, XML文件中的所有内容都是一个节点。该节点表示XML文件的组件。 DOM解析器处理缓慢, 并且在将XML文件加载到内存时会占用大量内存。
我们必须遵循以下过程来读取Java中的XML文件:
- 实例化XML文件:DOM解析器将XML文件加载到内存中, 并将每个标记视为一个元素。
- 获取根节点:Document类提供了getDocumentElement()方法来获取根节点和XML文件的元素。
- 获取所有节点:getElementByTagName()方法从XML文件中检索所有特定的标记名称。其中ELEMENT_NODE类型是指具有子元素的非文本节点。如果需要从头开始访问所有节点(包括根节点), 则可以递归调用getChildElement()方法。
- 按文本值获取节点:我们可以使用getElementByTextValue()方法来按其值搜索节点。
- 按属性值获取节点:如果要按特定属性的值搜索节点, 则可以将getElementByTagName()方法与getAttribute()方法一起使用。
使用Eclipse在Java中读取XML文件的步骤
步骤1:创建一个简单的Java项目。
步骤2:创建一个类文件并提供一个类文件名。我们创建了名为ReadXMLFileExample1的类文件。
步骤3:编写以下代码。
步骤4:下载dom-2.3.0-jaxb-1.0.6.jar文件:单击此处…
步骤5:在项目中创建一个lib文件夹。
步骤6:复制dom-2.3.0-jaxb-1.0.6.jar文件并粘贴到lib文件夹中。
步骤7:设定类别路径:
右键单击项目->构建路径->配置构建路径->添加外部JAR->选择JAR文件->单击打开按钮->应用并关闭。
步骤8:创建XML文件。我们已经创建了一个名为XMLFile.xml的XML文件, 并将以下数据写入其中。
步骤9:运行项目。
创建XML文件:XMLFile.xml
<?xml version="1.0"?>
<class>
<student>
<id>101</id>
<firstname>Naman</firstname>
<lastname>Kumar</lastname>
<subject>Math</subject>
<marks>83</marks>
</student>
<student>
<id>102</id>
<firstname>Kapil</firstname>
<lastname>Kumar</lastname>
<subject>Chemistry</subject>
<marks>60</marks>
</student>
<student>
<id>103</id>
<firstname>Harsh</firstname>
<lastname>Singh</lastname>
<subject>English</subject>
<marks>70</marks>
</student>
<student>
<id>104</id>
<firstname>Jitesh</firstname>
<lastname>Singh</lastname>
<subject>Physics</subject>
<marks>76</marks>
</student>
</class>
使用DOM解析器读取XML文件的示例
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;
import java.io.File;
public class ReadXMLFileExample1
{
public static void main(String argv[])
{
try
{
//creating a constructor of file class and parsing an XML file
File file = new File("F:\\XMLFile.xml");
//an instance of factory that gives a document builder
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//an instance of builder to parse the specified xml file
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(file);
doc.getDocumentElement().normalize();
System.out.println("Root element: " + doc.getDocumentElement().getNodeName());
NodeList nodeList = doc.getElementsByTagName("student");
// nodeList is not iterable, so we are using for loop
for (int itr = 0; itr < nodeList.getLength(); itr++)
{
Node node = nodeList.item(itr);
System.out.println("\nNode Name :" + node.getNodeName());
if (node.getNodeType() == Node.ELEMENT_NODE)
{
Element eElement = (Element) node;
System.out.println("Student id: "+ eElement.getElementsByTagName("id").item(0).getTextContent());
System.out.println("First Name: "+ eElement.getElementsByTagName("firstname").item(0).getTextContent());
System.out.println("Last Name: "+ eElement.getElementsByTagName("lastname").item(0).getTextContent());
System.out.println("Subject: "+ eElement.getElementsByTagName("subject").item(0).getTextContent());
System.out.println("Marks: "+ eElement.getElementsByTagName("marks").item(0).getTextContent());
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
输出:
Root element: class
Node Name: student
Student id: 101
First Name: Naman
Last Name: Kumar
Subject: Math
Marks: 83
Node Name: student
Student id: 102
First Name: Kapil
Last Name: Kumar
Subject: Chemistry
Marks: 60
Node Name: student
Student id: 103
First Name: Harsh
Last Name: Singh
Subject: English
Marks: 70
Node Name: student
Student id: 104
First Name: Jitesh
Last Name: Singh
Subject: Physics
Marks: 76
让我们看另一个读取xml文件的示例。
使用DOM解析器读取XML文件的示例
下面的示例读取相同的XML文件XMLFile.xml, 并说明如何一个接一个地循环节点。它将打印节点值, 名称和属性(如果有)。
例
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class ReadXMLFileExample2
{
public static void main(String[] args)
{
try
{
File file = new File("F:\\XMLFile.xml");
DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = documentBuilder.parse(file);
System.out.println("Root element: "+ document.getDocumentElement().getNodeName());
if (document.hasChildNodes())
{
printNodeList(document.getChildNodes());
}
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
}
private static void printNodeList(NodeList nodeList)
{
for (int count = 0; count < nodeList.getLength(); count++)
{
Node elemNode = nodeList.item(count);
if (elemNode.getNodeType() == Node.ELEMENT_NODE)
{
// get node name and value
System.out.println("\nNode Name =" + elemNode.getNodeName()+ " [OPEN]");
System.out.println("Node Content =" + elemNode.getTextContent());
if (elemNode.hasAttributes())
{
NamedNodeMap nodeMap = elemNode.getAttributes();
for (int i = 0; i < nodeMap.getLength(); i++)
{
Node node = nodeMap.item(i);
System.out.println("attr name : " + node.getNodeName());
System.out.println("attr value : " + node.getNodeValue());
}
}
if (elemNode.hasChildNodes())
{
//recursive call if the node has child nodes
printNodeList(elemNode.getChildNodes());
}
System.out.println("Node Name =" + elemNode.getNodeName()+ " [CLOSE]");
}
}
}
}
输出:
Root element: class
Node Name =class [OPEN]
Node Content =
101
Naman
Kumar
Maths
83
102
Kapil
Kumar
Chemistry
60
103
Harsh
Singh
English
70
104
Jitesh
Singh
Physics
76
Node Name =student [OPEN]
Node Content =
101
Naman
Kumar
Maths
83
Node Name =id [OPEN]
Node Content =101
Node Name =id [CLOSE]
Node Name =firstname [OPEN]
Node Content =Naman
Node Name =firstname [CLOSE]
Node Name =lastname [OPEN]
Node Content =Kumar
Node Name =lastname [CLOSE]
Node Name =subject [OPEN]
Node Content =Math
Node Name =subject [CLOSE]
Node Name =marks [OPEN]
Node Content =83
Node Name =marks [CLOSE]
Node Name =student [CLOSE]
Node Name =student [OPEN]
Node Content =
102
Kapil
Kumar
Chemistry
60
Node Name =id [OPEN]
Node Content =102
Node Name =id [CLOSE]
Node Name =firstname [OPEN]
Node Content =Kapil
Node Name =firstname [CLOSE]
Node Name =lastname [OPEN]
Node Content =Kumar
Node Name =lastname [CLOSE]
Node Name =subject [OPEN]
Node Content =Chemistry
Node Name =subject [CLOSE]
Node Name =marks [OPEN]
Node Content =60
Node Name =marks [CLOSE]
Node Name =student [CLOSE]
Node Name =student [OPEN]
Node Content =
103
Harsh
Singh
English
70
Node Name =id [OPEN]
Node Content =103
Node Name =id [CLOSE]
Node Name =firstname [OPEN]
Node Content =Harsh
Node Name =firstname [CLOSE]
Node Name =lastname [OPEN]
Node Content =Singh
Node Name =lastname [CLOSE]
Node Name =subject [OPEN]
Node Content =English
Node Name =subject [CLOSE]
Node Name =marks [OPEN]
Node Content =70
Node Name =marks [CLOSE]
Node Name =student [CLOSE]
Node Name =student [OPEN]
Node Content =
104
Jitesh
Singh
Physics
76
Node Name =id [OPEN]
Node Content =104
Node Name =id [CLOSE]
Node Name =firstname [OPEN]
Node Content =Jitesh
Node Name =firstname [CLOSE]
Node Name =lastname [OPEN]
Node Content =Singh
Node Name =lastname [CLOSE]
Node Name =subject [OPEN]
Node Content =Physics
Node Name =subject [CLOSE]
Node Name =marks [OPEN]
Node Content =76
Node Name =marks [CLOSE]
Node Name =student [CLOSE]
Node Name =class [CLOSE]
Java SAX解析器
Java SAX解析器代表XML的简单API。 SAX解析器逐行解析XML文件。当遇到xml文件中的开始标记, 结束标记和字符数据时, 它将触发事件。 SAX解析器也称为基于事件的解析器。
SAX解析器不会将任何XML文件加载到内存中。它不会创建XML文档的任何对象表示形式。 SAX解析器使用回调函数将XML文档结构通知客户端。与DOM解析器相比, 它更快并且使用的内存更少。
SAX是XML的流接口, 这意味着XML文件从文档顶部开始, 到根元素结束为止, 按顺序解析。
使用SAX解析器读取XML文件的示例
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class ReadXMLFileExample3
{
public static void main(String args[])
{
try
{
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler()
{
boolean id = false;
boolean firstname = false;
boolean lastname = false;
boolean subject = false;
boolean marks = false;
//parser starts parsing a specific element inside the document
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
{
System.out.println("Start Element :" + qName);
if(qName.equalsIgnoreCase("Id"))
{
id=true;
}
if (qName.equalsIgnoreCase("FIRSTNAME"))
{
firstname = true;
}
if (qName.equalsIgnoreCase("LASTNAME"))
{
lastname = true;
}
if (qName.equalsIgnoreCase("SUBJECT"))
{
subject = true;
}
if (qName.equalsIgnoreCase("MARKS"))
{
marks = true;
}
}
//parser ends parsing the specific element inside the document
public void endElement(String uri, String localName, String qName) throws SAXException
{
System.out.println("End Element:" + qName);
}
//reads the text value of the currently parsed element
public void characters(char ch[], int start, int length) throws SAXException
{
if (id)
{
System.out.println("ID : " + new String(ch, start, length));
id = false;
}
if (firstname)
{
System.out.println("First Name: " + new String(ch, start, length));
firstname = false;
}
if (lastname)
{
System.out.println("Last Name: " + new String(ch, start, length));
lastname = false;
}
if (subject)
{
System.out.println("Subject: " + new String(ch, start, length));
subject = false;
}
if (marks)
{
System.out.println("Marks : " + new String(ch, start, length));
marks = false;
}
}
};
saxParser.parse("F:\\XMLFile.xml", handler);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
输出:
Start Element: class
Start Element: student
Start Element: id
ID: 101
End Element: id
Start Element: firstname
First Name: Naman
End Element: firstname
Start Element: lastname
Last Name: Kumar
End Element: lastname
Start Element: subject
Subject: Math
End Element: subject
Start Element: marks
Marks: 83
End Element: marks
End Element: student
Start Element: student
Start Element: id
ID: 102
End Element: id
Start Element: firstname
First Name: Kapil
End Element: firstname
Start Element: lastname
Last Name: Kumar
End Element: lastname
Start Element: subject
Subject: Chemistry
End Element: subject
Start Element: marks
Marks: 60
End Element: marks
End Element: student
Start Element: student
Start Element: id
ID: 103
End Element: id
Start Element: firstname
First Name: Harsh
End Element: firstname
Start Element: lastname
Last Name: Singh
End Element: lastname
Start Element: subject
Subject: English
End Element: subject
Start Element: marks
Marks: 70
End Element: marks
End Element: student
Start Element: student
Start Element: id
ID: 104
End Element: id
Start Element: firstname
First Name: Jitesh
End Element: firstname
Start Element: lastname
Last Name: Singh
End Element: lastname
Start Element: subject
Subject: Physics
End Element: subject
Start Element: marks
Marks: 76
End Element: marks
End Element: student
End Element: class
评论前必须登录!
注册