迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Java >

将 XML 解析为 Java 对象

作者:迹忆客 最近更新:2023/08/02 浏览次数:

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 拼写检查

下一篇:没有了

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Java 拼写检查

发布时间:2023/08/02 浏览次数:85 分类:Java

本文介绍如何在 Java 中检查单词拼写。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 之间

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便