将 XML 解析为 Java 对象
XML 是用于任何软件环境存储、修改和共享数据的最广泛使用的技术。 当 XML 文件到达时,我们的首要任务是解析它并对其进行处理。
本文将教我们如何用 Java 解析 XML 并将其转换为对象。
将 XML 解析为 Java 对象
当谈论用 Java 解析 XML 文件时,Java 中提供了一些常见且最常用的解析器。 DOM 解析器、SAX 解析器和 StAX 解析器是最受欢迎的。
我们将看到每个 XML 解析器的示例。 但是,在开始之前,假设我们有一个如下所示的 XML 文件。
<?xml version = "1.0"?>
<class>
<person ID = "293">
<firstname>Alen</firstname>
<lastname>Walker</lastname>
<email>alen@email.com</email>
</person>
<person ID = "393">
<firstname>Stefen</firstname>
<lastname>Dev</lastname>
<email>stefen@email.com</email>
</person>
<person ID = "493">
<firstname>John</firstname>
<lastname>Doe</lastname>
<email>john@email.com</email>
</person>
</class>
方法一:使用DOM解析器将XML解析为Java对象
示例代码:
//importing necessary files
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 JavaXMLParsing {
public static void main(String[] args) {
try {
// Locating the file
File MyFile = new File("G:\\Order 011\\BATCH\\Myxml.xml");
// Creating a document object document builder.
DocumentBuilderFactory DBF = DocumentBuilderFactory.newInstance();
DocumentBuilder DB = DBF.newDocumentBuilder();
Document DOC = DB.parse(MyFile);
DOC.getDocumentElement().normalize();
// Printing the root element
System.out.println("Root element: " +
DOC.getDocumentElement().getNodeName());
// Find the primary node
NodeList NodeList = DOC.getElementsByTagName("person");
// Extracting data from child node
for (int itr = 0; itr < NodeList.getLength(); itr++){
Node MyNode = NodeList.item(itr);
System.out.println("\nNode Name:" + MyNode.getNodeName());
if (MyNode.getNodeType() == Node.ELEMENT_NODE){
Element element = (Element) MyNode;
System.out.println("First Name: "+
element.getElementsByTagName("firstname")
.item(0).getTextContent());
System.out.println("Last Name: "+
element.getElementsByTagName("lastname")
.item(0).getTextContent());
System.out.println("Email: "+
element.getElementsByTagName("email")
.item(0).getTextContent());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出:
Root element: class
Node Name: person
First Name: Alen
Last Name: Walker
Email: alen@email.com
Node Name: person
First Name: Stefen
Last Name: Dev
Email: stefen@email.com
Node Name: person
First Name: John
Last Name: Doe
Email: john@email.com
请记住,在使用 DOM 解析器 jar 文件之前,您必须下载它。 你可以从这里得到它。
方法2:使用SAX解析器将XML解析为Java对象
示例代码:
//importing necessary files
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 JavaSAXParser {
public static void main(String argv[]){
try {
// Organizing a SAXParser
SAXParserFactory MyFactory = SAXParserFactory.newInstance();
SAXParser SaxParser = MyFactory.newSAXParser();
// Creating a default handler
DefaultHandler MyHandler = new DefaultHandler() {
boolean firstname = false;
boolean lastname = false;
boolean email = false;
// Extracting data from the XML
public void startElement(String uri, String localName, String qName,
Attributes attributes)throws SAXException{
if (qName.equalsIgnoreCase("firstname")) {
firstname = true;
}
if (qName.equalsIgnoreCase("lastname")) {
lastname = true;
}
if (qName.equalsIgnoreCase("email")) {
email = true;
}
}
public void characters(char ch[], int start, int length)
throws SAXException{
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 (email) {
System.out.println("Email: " +
new String(ch, start, length));
email = false;
}
}
};
SaxParser.parse("G:\\Order 011\\BATCH\\Myxml.xml", MyHandler);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
输出:
First Name: Alen
Last Name: Walker
Email: alen@email.com
First Name: Stefen
Last Name: Dev
Email: stefen@email.com
First Name: John
Last Name: Doe
Email: john@email.com
方法3:使用StAX Parser将XML解析为Java对象
示例代码:
//importing necessary files
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Iterator;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.*;
public class JavaSTAXparser {
private static boolean firstname, lastname, email;
public static void main(String[] args)
throws FileNotFoundException, XMLStreamException {
// Locating the file
File file = new File("G:\\Order 011\\BATCH\\Myxml.xml");
// Parsing the file with the parse() method
parser(file);
}
// The parse() method
public static void parser(File file)
throws FileNotFoundException, XMLStreamException {
firstname = lastname = email = false;
// Declaring a XMLInputFactory object
XMLInputFactory MyFactory = XMLInputFactory.newInstance();
// Declaring a XMLEventReader object
XMLEventReader EventReader = MyFactory
.createXMLEventReader(new FileReader(file));
while (EventReader.hasNext()){
// Creating a xml event
XMLEvent Event = EventReader.nextEvent();
if (Event.isStartElement()){
// Extracting data from the xml file
StartElement Element = (StartElement)Event;
Iterator<Attribute> iterator = Element.getAttributes();
while (iterator.hasNext()){
Attribute attribute = iterator.next();
QName name = attribute.getName();
String value = attribute.getValue();
System.out.println(name+" = " + value);
}
if (Element.getName().toString().equalsIgnoreCase("firstname")){
firstname = true;
}
if (Element.getName().toString().equalsIgnoreCase("lastname")){
lastname = true;
}
if (Element.getName().toString().equalsIgnoreCase("email")){
email = true;
}
}
if (Event.isEndElement()){
EndElement Element = (EndElement) Event;
if (Element.getName().toString().equalsIgnoreCase("firstname")){
firstname = false;
}
if (Element.getName().toString().equalsIgnoreCase("lastname")){
lastname = false;
}
if (Element.getName().toString().equalsIgnoreCase("email")){
email = false;
}
}
if (Event.isCharacters()){
Characters Element = (Characters) Event;
if (firstname){
System.out.println(Element.getData());
}
if (lastname){
System.out.println(Element.getData());
}
if (email){
System.out.println(Element.getData());
}
}
}
}
}
输出:
ID = 293
Alen
Walker
alen@email.com
ID = 393
Stefen
Dev
stefen@email.com
ID = 493
John
Doe
john@email.com
上面,我们讨论了将 XML 解析为 Java 对象并从中提取数据的三种不同方法。 您可以根据需要选择其中任何一个。
相关文章
Java 的 Gitignore 文件
发布时间:2023/08/02 浏览次数:101 分类:Java
-
本文通过示例讨论 Java 的 .gitignore 文件,并列出了手动创建 .gitignore 时要遵循的规则。Java .gitignore 文件概述
在 Java 中创建 SSH 连接
发布时间:2023/08/02 浏览次数:91 分类:Java
-
本文讨论如何打开 SSH 连接,并演示如何使用 JSch 和 Apache Mina SSHD 创建 SSH 连接。在 Java 中创建 SSH 连接
Java 中的二进制数加法
发布时间:2023/08/02 浏览次数:65 分类:Java
-
本文介绍如何在 Java 中执行二进制加法。Java 中的二进制数加法 二进制数是 1 和 0 的组合,与算术数不同,相加的方式不同。 二进制数的加法规则为:
Java Spring Boot 中的Autowired
发布时间:2023/08/02 浏览次数:67 分类:Java
-
Spring Boot 是一个流行的 Java 框架。 在Spring Boot中,最常用的注解是@Autowired,主要用于自动收集bean。在这篇文章中,我们将讨论Java Spring Boot中的@Autowired。
Java 中的后缀表达式
发布时间:2023/08/02 浏览次数:136 分类:Java
-
后缀表达式比中缀表达式更容易计算并且速度更快,因为我们不需要处理或遵循任何运算符优先级规则。 此外,后缀表达式不包含任何括号。
Java 中的增量映射
发布时间:2023/08/02 浏览次数:100 分类:Java
-
在 Java 中使用 Map 或 HashMap 时,您可能需要增加该值。 在 Java 中,有很多方法可以增加 Map 的值。方法一:Java中Map值递增的通用方法
设置 java.util.Date 的时区
发布时间:2023/08/02 浏览次数:130 分类:Java
-
本文将介绍如何使用 Java 设置与日期关联的时区。 java.util.Date 没有时区。使用 ZonedDateTime 设置 java.util.Date 的时区
Java Date vs. LocalDate
发布时间:2023/08/02 浏览次数:146 分类:Java
-
本文介绍了 Java 中 Date 和 LocalDate 之间的区别。Java 日期与 LocalDate Date类来自Java util包,LocalDate类被添加到Java的Time包中。 这两个类都用于 Java 中的日期; 让我们看看 Java 中 Date 和 LocalDate 之间