XML详解

文章目录

XML概述

XML(Extensible Markup Language,可扩展标记语言)是一种用于存储和交换数据的标准格式,它由W3C(万维网联盟)推荐并维护。在Java中,XML的应用非常广泛,主要用于配置文件、数据传输、数据持久化等多个方面。

XML概述

定义:

XML是一种标记语言,它允许用户定义自己的标记(或称为标签)来描述文档的结构。

XML是纯文本文件,它的内部由标签和数据组成,标签用于描述数据的含义。

特点:

可扩展性:XML允许用户根据需要定义自己的标签。

自描述性:XML文档的结构通过标签来描述,易于人类阅读和编写。

结构化:XML文档具有明确的层级结构,便于机器解析和处理。

XML语法

文档声明:

一个标准的XML文档通常以文档声明开始,如<?xml version="1.0" encoding="UTF-8"?>,用于指定XML的版本和编码。

元素(标签):

元素是XML文档的基本组成单元,用于表示文档中的数据。

元素由开始标签、结束标签和可选的内容组成,如John。

属性:

属性是附加在元素上的名称-值对,用于提供元素的额外信息。

属性必须包含在元素的开始标签中,如。

注释:

XML注释以 结束,如 。

CDATA区:

CDATA区用于包含不需要被解析器解析的文本数据,如<![CDATA[这是不会被解析的文本]]>。

XML(eXtensible Markup Language)是一种标记语言,其主要特点是自描述性和平台无关性。XML的设计目标是传输和存储数据,而不是显示数据。

● 声明:每个XML文档都以XML声明开始,声明了XML的版本和编码方式。
<?xml version="1.0" encoding="UTF-8"?>

● 元素:XML文档的基本结构单位,包含开始标签和结束标签。

value

● 属性:元素可以包含属性,用于提供元素的附加信息。

content

● 文本内容:元素可以包含文本内容。

● 命名空间:用于区分不同XML文档中的元素和属性。

<root xmlns:h="http://www.w3.org/TR/html4/" xmlns:f="http://www.w3.org/TR/1999/REC-xslt-19991116">
  <h:table>
    <h:tr>
      <h:td>Apples</h:td>
      <h:td>Bananas</h:td>
    </h:tr>
  </h:table>
</root>

XML在Java中的应用

配置文件:

Java应用程序经常使用XML文件作为配置文件,存储运行时参数、数据库连接信息等。

常见的Java框架(如Spring)广泛使用XML配置文件来声明Bean、事务管理等。

undefined 数据传输:

在Web服务和分布式系统中,XML常用作数据交换的格式。

SOAP协议就是基于XML的一种协议,用于在Web服务中交换结构化信息。

数据持久化:

虽然现代Java应用程序更倾向于使用数据库来持久化数据,但XML文件仍可用于存储简单的配置信息或用户偏好设置。

文档生成:

Java提供了强大的库(如JAXP、JAXB)来解析和生成XML文档。

这些库可以将Java对象序列化为XML文档,或将XML文档反序列化为Java对象。

XML解析技术

Java提供了多种解析XML的API,常用的有以下几种:

XML在Java中的使用非常广泛,包括配置文件、数据交换、持久化、UI布局等。Java提供了多种解析XML的API,如DOM、SAX、StAX等,以及用于对象和XML转换的JAXB。掌握这些技术可以有效地处理XML数据,并在Java应用程序中充分利用XML的优势。

在Java中,解析XML文档主要有以下几种方式:

DOM(Document Object Model)解析:

DOM解析将整个XML文档加载到内存中,并构建成一个树状结构(DOM树)。

优点:易于操作,支持CRUD(创建、读取、更新、删除)操作。

缺点:内存消耗大,不适合处理大型XML文档。

SAX(Simple API for XML)解析:

SAX解析是基于事件的解析方式,它逐行读取XML文档,并在遇到特定的元素或属性时触发事件。

优点:内存消耗小,适用于大型XML文档。

缺点:只能按顺序读取,不支持随机访问和CRUD操作。

StAX(Streaming API for XML)解析:

StAX解析是另一种基于流的解析方式,它允许以拉(pull)或推(push)的方式读取XML文档。

优点:结合了DOM和SAX的优点,支持随机访问和CRUD操作,同时内存消耗较小。

缺点:相对于DOM和SAX,StAX的API可能更复杂一些。

XML在Java开发中扮演着重要的角色,主要用于配置文件、数据传输、数据持久化等多个方面。Java提供了多种解析XML文档的技术,包括DOM、SAX和StAX等,开发者可以根据实际需求选择适合的解析方式。

  1. DOM解析
    DOM(Document Object Model)解析器将整个XML文档加载到内存中并解析为一个树结构,便于对XML文档进行操作。适用于小型XML文档。

    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.NodeList;

    public class DomParserExample {
    public static void main(String[] args) {
    try {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document document = builder.parse("example.xml");

             Element root = document.getDocumentElement();
             NodeList nodeList = root.getElementsByTagName("element");
             for (int i = 0; i < nodeList.getLength(); i++) {
                 Element element = (Element) nodeList.item(i);
                 System.out.println("Element value: " + element.getTextContent());
             }
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
    

    }

  2. SAX解析
    SAX(Simple API for XML)解析器逐行读取XML文档,适用于大型XML文档。SAX解析器是基于事件驱动的,当它读取到文档的某个部分时,会触发相应的事件。

    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 SaxParserExample {
    public static void main(String[] args) {
    try {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser saxParser = factory.newSAXParser();
    saxParser.parse("example.xml", new DefaultHandler() {
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    if (qName.equalsIgnoreCase("element")) {
    System.out.println("Start Element: " + qName);
    }
    }

                 public void endElement(String uri, String localName, String qName) throws SAXException {
                     if (qName.equalsIgnoreCase("element")) {
                         System.out.println("End Element: " + qName);
                     }
                 }
    
                 public void characters(char[] ch, int start, int length) throws SAXException {
                     System.out.println("Element value: " + new String(ch, start, length));
                 }
             });
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
    

    }

  3. StAX解析
    StAX(Streaming API for XML)是一种基于光标的解析方法,提供了一个更简洁的接口来处理XML流,支持以读取或写入模式处理XML。
    import javax.xml.stream.XMLEventReader;
    import javax.xml.stream.XMLInputFactory;
    import javax.xml.stream.events.XMLEvent;
    import java.io.FileReader;

public class StaxParserExample {

public static void main(String[] args) {

try {

XMLInputFactory factory = XMLInputFactory.newInstance();

XMLEventReader eventReader = factory.createXMLEventReader(new FileReader("example.xml"));

        while (eventReader.hasNext()) {
            XMLEvent event = eventReader.nextEvent();
            if (event.isStartElement()) {
                System.out.println("Start Element: " + event.asStartElement().getName());
            } else if (event.isEndElement()) {
                System.out.println("End Element: " + event.asEndElement().getName());
            } else if (event.isCharacters()) {
                System.out.println("Element value: " + event.asCharacters().getData());
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

使用JAXB进行对象和XML的转换

JAXB(Java Architecture for XML Binding)提供了将Java对象转换为XML格式以及从XML格式转换为Java对象的功能。

将Java对象转换为XML

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

public class JaxbExample {
    public static void main(String[] args) {
        try {
            JAXBContext context = JAXBContext.newInstance(Employee.class);
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

            Employee employee = new Employee();
            employee.setId(1);
            employee.setName("John Doe");
            employee.setPosition("Developer");

            marshaller.marshal(employee, System.out);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }
}

@XmlRootElement
class Employee {
    private int id;
    private String name;
    private String position;

    // getters and setters
}

从XML转换为Java对象

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;

public class JaxbUnmarshalExample {
    public static void main(String[] args) {
        try {
            String xml = "<employee><id>1</id><name>John Doe</name><position>Developer</position></employee>";
            JAXBContext context = JAXBContext.newInstance(Employee.class);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            Employee employee = (Employee) unmarshaller.unmarshal(new StringReader(xml));
            System.out.println(employee.getName());
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }
}

@XmlRootElement
class Employee {
    private int id;
    private String name;
    private String position;

    // getters and setters
}

XML Schema和验证

XML Schema定义了XML文档的结构,Java可以使用javax.xml.validation包对XML文档进行验证。

import javax.xml.XMLConstants;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import java.io.File;

public class XmlValidationExample {
    public static void main(String[] args) {
        try {
            SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
            Validator validator = factory.newSchema(new File("schema.xsd")).newValidator();
            validator.validate(new StreamSource(new File("example.xml")));
            System.out.println("XML is valid");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

XML在Java中的应用

1.mybatis

2.spring

3.接口

4.Apache Maven

5.SOAP

6.Log4日志文件

XML(可扩展标记语言)在Java编程中有广泛的应用,主要用于以下几个方面:

  1. 配置文件
    Spring框架
    Spring框架广泛使用XML来配置Bean和其他应用程序组件。

    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="exampleBean" class="com.example.ExampleBean">
    <property name="property" value="value"/>
    </bean>
    </beans>

Apache Maven

Maven使用pom.xml文件来配置项目构建过程、依赖管理等。

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>example-project</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.8</version>
        </dependency>
    </dependencies>
</project>
  1. 数据交换
    Web服务
    XML在SOAP(简单对象访问协议)中用于消息传递和远程过程调用。

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://example.com/webservice">
    soapenv:Header/
    soapenv:Body
    web:GetExampleRequest
    web:id123</web:id>
    </web:GetExampleRequest>
    </soapenv:Body>
    </soapenv:Envelope>

数据传输

用于系统之间的数据交换,例如使用XML文件作为数据导入和导出格式。

<employees>
    <employee>
        <id>1</id>
        <name>John Doe</name>
        <position>Developer</position>
    </employee>
    <employee>
        <id>2</id>
        <name>Jane Smith</name>
        <position>Manager</position>
    </employee>
</employees>
  1. 持久化
    Java Persistence API (JPA)
    在JPA中,orm.xml文件用于对象关系映射配置。

    <entity-mappings xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm orm_2_1.xsd" version="2.1">
    <entity class="com.example.model.Employee">


    <attributes>
    <id name="id">
    <generated-value strategy="AUTO"/>
    </id>
    <basic name="name"/>
    <basic name="position"/>
    </attributes>
    </entity>
    </entity-mappings>

  2. UI布局
    JavaFX
    JavaFX使用FXML文件定义用户界面布局。

    <?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.Button?> <?import javafx.scene.layout.VBox?> <VBox xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"> <Button text="Click me" fx:id="button" onAction="#handleButtonClick"/> </VBox>
  3. 配置持久化
    Hibernate
    Hibernate可以使用hibernate.cfg.xml文件配置数据库连接和其他设置。

    <hibernate-configuration> <session-factory> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydb</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">password</property> <mapping class="com.example.model.Employee"/> </session-factory> </hibernate-configuration>
  4. 国际化和本地化
    XML文件可以用于存储国际化(i18n)和本地化(l10n)的资源。

    <resources> <string name="greeting">Hello, world!</string> </resources>
  5. 日志配置
    Log4j
    Log4j使用XML文件来配置日志记录。

    <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="debug"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>
  6. 这些是Java中使用XML的一些主要方面。XML的灵活性和可扩展性使其成为配置、数据交换、持久化和其他许多用途的理想选择。

    相关推荐
    Dylanioucn2 分钟前
    【编程底层思考】什么是GC Roots
    java·jvm
    _晓夏_4 分钟前
    【JVM 工具命令】JAVA程序线上问题诊断,JVM工具命令的使用,jstat, jstack,jmap命令的使用
    java·开发语言·jvm·jvm命令工具·java程序线上问题定位命令·java程序问题故障排查命令·jvm线上问题故障排查
    Ty_110621 分钟前
    深入理解Java虚拟机:Jvm总结-虚拟机字节码执行引擎
    java·开发语言·jvm
    蔚一43 分钟前
    Java设计模式—面向对象设计原则(一) ----->开闭原则OCP(完整详解,附有代码+案例)
    java·后端·设计模式·intellij-idea·开闭原则
    cesske1 小时前
    java 学习从零到精通之历程
    java
    爱吃香蕉的猴哥1 小时前
    Spring AOP
    java·后端·spring
    Sebastian Wang1 小时前
    【学习归纳自我总结版】尚硅谷学习第一天
    java·学习
    青灯古佛初照1 小时前
    EasyExcel 动态表头+表头合并
    java·excel
    goldfishsky1 小时前
    Gson转换
    java·开发语言
    小巫医初春1 小时前
    【EasyExcel】@ColumnWidth(value = 20) EasyExcel设置列宽不生效
    java