今天是入职第二周,今天有个任务是解析xml(报文)
xml简单来说就是一种数据格式,可以跨平台传输,类似于json,
经常需要转换
准备工作
工具cmd trang.jar a.xml
a.xml中的内容
<Books>
<Book>
<name>书名A</name>
<author>作者A</author>
<price>作者A</price>
</Book>
<Book>
<name>书名B</name>
<author>作者B</author>
<price>作者B</price>
</Book>
</Books>
首先要通过trang.jar包生成xsd约束
xsd:XML Schema Definition。一份XML schema文件描述了可扩展标记语言文档的结构。
将报文(xml),trang.jar,放到桌面上
打开cmd切换到桌面路径下
cd Desktop
输入命令生成xsd约束
java -jar trang.jar a.xml a.xsd
内容如下
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="Books">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="Book"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Book">
<xs:complexType>
<xs:sequence>
<xs:element ref="name"/>
<xs:element ref="author"/>
<xs:element ref="price"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="name" type="xs:NCName"/>
<xs:element name="author" type="xs:NCName"/>
<xs:element name="price" type="xs:NCName"/>
</xs:schema>
xsd类似于dtd约束,但更强大,用于规定xml中的数据格式
其次使用xsd生成对应类
xjc a.xsd
得到其中有
现在可以将生成的类加到项目中去,通过工具把xml数据源和通过类产生的对象进行转换
编写调用的代码
其中有两个方法,分别是
JAXB.unmarshal(reader, Books.class)
该方法传入要转换的xml文件,和想要解析成的对应类,返回包含数据的该类对象
JAXB.marshal(books, output)
该方法传入已有的类对象,和想要解析到的位置(文件),就会生成对应文件
package demo;
import generated.Book;
import generated.Books;
import generated.ObjectFactory;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import javax.xml.bind.JAXB;
/**
* @brief 类简要说明
*
* 类详细说明
*
* @author
* - 2019-7-24 刘华北 创建初始版本
*
*/
public class DealWithXml {
public static void main(String[] args) throws FileNotFoundException {
marshal(new FileOutputStream("C:\\Users\\XWJ\\Desktop\\b.xml"));
unmarshal(new FileReader("a.xml"));
}
private static void unmarshal(FileReader reader) {
try {
Books books = JAXB.unmarshal(reader, Books.class);
System.out.println(books.getBook().size());
System.out.println(books.getBook().get(0).getName());
System.out.println(books.getBook().get(0).getAuthor());
System.out.println(books.getBook().get(0).getPrice());
} finally {
try {
reader.close();
} catch (IOException e) {
}
}
}
private static void marshal(OutputStream output) {
ObjectFactory factory = new ObjectFactory();
Books books = factory.createBooks();
List<Book> bookList = books.getBook();
Book book = factory.createBook();
book.setName("书名A");
book.setAuthor("作者A");
book.setPrice("价格A");
bookList.add(book);
book = factory.createBook();
book.setName("书名B");
book.setAuthor("作者B");
book.setPrice("价格B");
bookList.add(book);
book = factory.createBook();
book.setName("书名C");
book.setAuthor("作者C");
book.setPrice("价格C");
bookList.add(book);
try {
JAXB.marshal(books, output);
} finally {
try {
output.close();
} catch (IOException e) {
}
}
}
}
通过解析在控制台输出
3
书名A
作者A
价格A
通过创建的对象生成的xml中的内容
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Books>
<Book>
<name>书名A</name>
<author>作者A</author>
<price>价格A</price>
</Book>
<Book>
<name>书名B</name>
<author>作者B</author>
<price>价格B</price>
</Book>
<Book>
<name>书名C</name>
<author>作者C</author>
<price>价格C</price>
</Book>
</Books>