一、XML是什么
XML(可扩展标记语言)是一种非常常用的数据存储和交换格式。
二、XML 的基本结构
- 声明
-
- XML 文件通常以 XML 声明开始,例如:
<?xml version="1.0" encoding="UTF-8"?>
。它指定了 XML 的版本和编码方式。
- XML 文件通常以 XML 声明开始,例如:
- 元素
-
- XML 由元素组成。一个元素通常由开始标签、内容和结束标签组成。例如:
<book><title>XML 入门</title><author>某人</author></book>
。 - 元素可以嵌套,形成层次结构。
- XML 由元素组成。一个元素通常由开始标签、内容和结束标签组成。例如:
- 属性
-
- 元素可以有属性,属性在开始标签中指定。例如:
<book id="123"><title>XML 进阶</title><author>另一人</author></book>
,这里的 "id" 就是属性。
- 元素可以有属性,属性在开始标签中指定。例如:
三、XML 的语法规则
- 标签必须正确嵌套,不能交叉嵌套。
- 标签必须成对出现,有开始标签就必须有结束标签。
- 属性值必须用引号括起来,可以是单引号或双引号。
- XML 是区分大小写的。
四、XML 的用途
- 数据存储
-
- 可以将数据以结构化的方式存储在 XML 文件中。例如,存储书籍信息、用户配置等。
- 数据交换
-
- 不同的系统可以使用 XML 作为数据交换的格式,因为它是平台无关的。
- 配置文件
-
- 许多软件使用 XML 作为配置文件,如服务器配置、应用程序设置等。
五、在 Java 中处理 XML
- DOM(文档对象模型)
-
- DOM 将 XML 文档表示为一个树结构,可以通过编程方式遍历和修改这个树。
- 使用步骤:
-
-
- 创建一个
DocumentBuilderFactory
。 - 使用工厂创建一个
DocumentBuilder
。 - 使用
DocumentBuilder
解析 XML 文件,得到一个Document
对象。 - 通过
Document
对象访问和操作 XML 元素和属性。
- 创建一个
-
- SAX(简单 API for XML)
-
- SAX 是一种基于事件的解析方式,在解析 XML 时,当遇到特定的元素、属性等时会触发相应的事件。
- 使用步骤:
-
-
- 创建一个
SAXParserFactory
。 - 使用工厂创建一个
SAXParser
。 - 创建一个自定义的
DefaultHandler
类来处理 SAX 事件。 - 使用
SAXParser
解析 XML 文件,并将自定义的DefaultHandler
作为参数传递。
- 创建一个
-
- JAXB(Java Architecture for XML Binding)
-
- JAXB 允许将 Java 对象与 XML 文档相互转换。
- 使用步骤:
-
-
- 创建 Java 类,并使用 JAXB 注解来指定与 XML 的映射关系。
- 使用
JAXBContext
来进行 Java 对象和 XML 之间的转换操作。
-
六、XML 的优点和缺点
- 优点:
-
- 结构化和自描述性,易于理解和阅读。
- 平台无关性,可以在不同的操作系统和编程语言中使用。
- 广泛的工具支持,有许多库和工具可用于处理 XML。
- 缺点:
-
- 相对较冗长,文件体积可能较大。
- 解析相对复杂和耗时,特别是对于大型 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());
}
}
}