当前位置: 首页 > article >正文

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());
        }
    }
}

http://www.kler.cn/a/281801.html

相关文章:

  • 原型模式详解
  • 关于xml中存在特殊的转义字符,不能正常反序列化问题
  • 编码和解码的理解
  • 【linux003】目录操作命令篇 - cd 命令
  • 插件安装/.crx文件安装
  • 大模型企业应用落地系列七》基于大模型的对话式推荐系统》对话管理层
  • 爆改YOLOv8 | 利用YOLOv9最新的SPPELAN模块改进SPPF
  • 阿里“10”年软件测试经验,面试官通常...........
  • 计算机毕业设计选题推荐-高中素质评价档案系统-Java/Python项目实战
  • 2024洗衣机选择(个人笔录)
  • Android SurfaceFlinger——共享内存读写流程(五十五)
  • 私有云仓库Harbor,docker-compose容器编排
  • Oracle迁移至openGauss的工具:ora2op的安装配置
  • redis | 认识非关系型数据库Redis的列表类型及python如何操作redis
  • P10641 BZOJ3252 攻略
  • android开发中使用WebView性能优化攻略
  • python从入门到精通:文件操作
  • 企业对个人信息数据的保护 | CCRC-PIPP​ 个人信息保护专业人员
  • uniapp+vue3+setup返回上一页传参
  • cthub-ssrf通关攻略