xml详解

一、XML是什么

XML(可扩展标记语言)是一种非常常用的数据存储和交换格式。

二、XML 的基本结构

  1. 声明
    • XML 文件通常以 XML 声明开始,例如:<?xml version="1.0" encoding="UTF-8"?>。它指定了 XML 的版本和编码方式。
  1. 元素
    • XML 由元素组成。一个元素通常由开始标签、内容和结束标签组成。例如:<book><title>XML 入门</title><author>某人</author></book>
    • 元素可以嵌套,形成层次结构。
  1. 属性
    • 元素可以有属性,属性在开始标签中指定。例如:<book id="123"><title>XML 进阶</title><author>另一人</author></book>,这里的 "id" 就是属性。

三、XML 的语法规则

  1. 标签必须正确嵌套,不能交叉嵌套。
  2. 标签必须成对出现,有开始标签就必须有结束标签。
  3. 属性值必须用引号括起来,可以是单引号或双引号。
  4. XML 是区分大小写的。

四、XML 的用途

  1. 数据存储
    • 可以将数据以结构化的方式存储在 XML 文件中。例如,存储书籍信息、用户配置等。
  1. 数据交换
    • 不同的系统可以使用 XML 作为数据交换的格式,因为它是平台无关的。
  1. 配置文件
    • 许多软件使用 XML 作为配置文件,如服务器配置、应用程序设置等。

五、在 Java 中处理 XML

  1. DOM(文档对象模型)
    • DOM 将 XML 文档表示为一个树结构,可以通过编程方式遍历和修改这个树。
    • 使用步骤:
      • 创建一个 DocumentBuilderFactory
      • 使用工厂创建一个 DocumentBuilder
      • 使用 DocumentBuilder 解析 XML 文件,得到一个 Document 对象。
      • 通过 Document 对象访问和操作 XML 元素和属性。
  1. SAX(简单 API for XML)
    • SAX 是一种基于事件的解析方式,在解析 XML 时,当遇到特定的元素、属性等时会触发相应的事件。
    • 使用步骤:
      • 创建一个 SAXParserFactory
      • 使用工厂创建一个 SAXParser
      • 创建一个自定义的 DefaultHandler 类来处理 SAX 事件。
      • 使用 SAXParser 解析 XML 文件,并将自定义的 DefaultHandler 作为参数传递。
  1. JAXB(Java Architecture for XML Binding)
    • JAXB 允许将 Java 对象与 XML 文档相互转换。
    • 使用步骤:
      • 创建 Java 类,并使用 JAXB 注解来指定与 XML 的映射关系。
      • 使用 JAXBContext 来进行 Java 对象和 XML 之间的转换操作。

六、XML 的优点和缺点

  1. 优点:
    • 结构化和自描述性,易于理解和阅读。
    • 平台无关性,可以在不同的操作系统和编程语言中使用。
    • 广泛的工具支持,有许多库和工具可用于处理 XML。
  1. 缺点:
    • 相对较冗长,文件体积可能较大。
    • 解析相对复杂和耗时,特别是对于大型 XML 文件。

七、xml和json之间的转换

注意需要添加依赖

   <dependency>
       <groupId>com.alibaba</groupId>
       <artifactId>fastjson</artifactId>
       <version>1.2.83</version>
   </dependency>


   <dependency>
       <groupId>com.fasterxml.jackson.dataformat</groupId>
       <artifactId>jackson-dataformat-xml</artifactId>
       <version>2.14.2</version>
   </dependency>

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import org.json.JSONException;
import org.json.XML;

import java.util.Map;

public class XmlJsonConverter {

    // JSON 转 XML
    public static String jsonToXml(String jsonStr) {
        try {
            JSONObject jsonObject = JSONObject.parseObject(jsonStr);
            Map<String, Object> map = jsonObject.toJavaObject(new TypeReference<Map<String, Object>>() {});
            return XML.toString(map);
        } catch (JSONException e) {
            e.printStackTrace();
            return null;
        }
    }

    // XML 转 JSON
    public static String xmlToJson(String xmlStr) {
        try {
            XmlMapper xmlMapper = new XmlMapper();
            JsonNode jsonNode = xmlMapper.readTree(xmlStr);
            ObjectMapper objectMapper = new ObjectMapper();
            return objectMapper.writeValueAsString(jsonNode);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

调用小工具

public class Main {
    public static void main(String[] args) {
        String json = "{\"name\":\"John\",\"age\":30,\"address\":{\"city\":\"New York\",\"street\":\"Main Street\"}}";
        String xml = XmlJsonConverter.jsonToXml(json);
        if (xml!= null) {
            System.out.println("JSON to XML:");
            System.out.println(xml);
        }

        String xmlStr = "<person><name>Jane</name><age>28</age><address><city>London</city><street>Oxford Street</street></address></person>";
        String jsonFromXml = XmlJsonConverter.xmlToJson(xmlStr);
        if (jsonFromXml!= null) {
            System.out.println("XML to JSON:");
            System.out.println(jsonFromXml);
        }
    }
}

八、xml和对象之间的转换

将 Java 对象转换为 XML 字符串以及将 XML 字符串转换回 Java 对象的方法。

注意,要转换的 Java 对象类需要使用 JAXB 注解进行适当的标注,如@XmlRootElement等。

同时,确保在项目中添加 JAXB 相关的依赖。

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

public class XmlObjectConverter {

    // 对象转 XML
    public static String objectToXml(Object obj) {
        try {
            JAXBContext context = JAXBContext.newInstance(obj.getClass());
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

            StringWriter writer = new StringWriter();
            marshaller.marshal(obj, writer);

            return writer.toString();
        } catch (JAXBException e) {
            e.printStackTrace();
            return null;
        }
    }

    // XML 转对象
    public static <T> T xmlToObject(String xml, Class<T> clazz) {
        try {
            JAXBContext context = JAXBContext.newInstance(clazz);
            Unmarshaller unmarshaller = context.createUnmarshaller();

            StringReader reader = new StringReader(xml);
            return (T) unmarshaller.unmarshal(reader);
        } catch (JAXBException e) {
            e.printStackTrace();
            return null;
        }
    }
}

新建一个java对象

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

使用工具

public class Main {
    public static void main(String[] args) {
        Person person = new Person("Alice", 25);
        String xml = XmlObjectConverter.objectToXml(person);
        if (xml!= null) {
            System.out.println("Object to XML:");
            System.out.println(xml);
        }

        String xmlStr = "<person><name>Bob</name><age>30</age></person>";
        Person personFromXml = XmlObjectConverter.xmlToObject(xmlStr, Person.class);
        if (personFromXml!= null) {
            System.out.println("XML to Object:");
            System.out.println("Name: " + personFromXml.getName() + ", Age: " + personFromXml.getAge());
        }
    }
}
相关推荐
一只爱打拳的程序猿1 分钟前
【Spring】更加简单的将对象存入Spring中并使用
java·后端·spring
杨荧3 分钟前
【JAVA毕业设计】基于Vue和SpringBoot的服装商城系统学科竞赛管理系统
java·开发语言·vue.js·spring boot·spring cloud·java-ee·kafka
minDuck5 分钟前
ruoyi-vue集成tianai-captcha验证码
java·前端·vue.js
为将者,自当识天晓地。23 分钟前
c++多线程
java·开发语言
daqinzl31 分钟前
java获取机器ip、mac
java·mac·ip
激流丶1 小时前
【Kafka 实战】如何解决Kafka Topic数量过多带来的性能问题?
java·大数据·kafka·topic
Themberfue1 小时前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
java·开发语言·线程·多线程·synchronized·
让学习成为一种生活方式1 小时前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言
晨曦_子画1 小时前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
南宫生2 小时前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法