(JAVA自学笔记八)jaxb解析xml文件到object

今天是入职第二周,今天有个任务是解析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>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值