Java读写xml(对复杂数据,使用中间模型)

4 篇文章 0 订阅

1、创建.xml,设计.xml结构。

 

<?xml version="1.0"?>
<Xmodel>
	<Xnodes>
		<Xnode id="n1" type="node2"></Xnode>
		<Xnode id="n2" type="node3"></Xnode>
		<Xnode id="n3" type="node4"></Xnode>
	</Xnodes>
	<Xbizs>
		<Xbiz id="b1" snode="n1" tnode="n2"></Xbiz>
		<Xbiz id="b2" snode="n3" tnode="n1"></Xbiz>
	</Xbizs>
</Xmodel>

 

 2、创建.xsd,可以借助XMLSpy软件,有从.xml生成.xsd功能。

      注意:maxOccurs="unbounded"这句,能表示出Xbizs里可以有很多Xbiz

 

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
	<xs:element name="Xmodel">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="Xnodes" type="Xnodes"/>
				<xs:element name="Xbizs" type="Xbizs"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:complexType name="Xnodes">
		<xs:sequence>
			<xs:element name="Xnode" type="Xnode" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="Xbizs">
		<xs:sequence>
			<xs:element name="Xbiz" type="Xbiz" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="Xnode">
		<xs:attribute name="id" type="xs:string" use="required"/>
		<xs:attribute name="type" type="xs:string" use="required"/>
	</xs:complexType>
	<xs:complexType name="Xbiz">
		<xs:attribute name="id" type="xs:string" use="required"/>
		<xs:attribute name="snode" type="xs:string" use="required"/>
		<xs:attribute name="tnode" type="xs:string" use="required"/>
	</xs:complexType>
</xs:schema>

3、生成中间模型,可以使用xjc命令,也可以借助专门编写的"ant打jar包"的.xml。这里我采用后者生成了.jar,结构如下:

 

-test.jaxb.jar
   -test.jaxb
      -ObjectFactory.class
      -Xbiz.class
      -Xbizs.class
      -Xmodel.class
      -Xnode.class
      -Xnodes.class
  

     Xmodel.java内容如下:

 

package test.jaxb;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "xnodes", "xbizs" })
@XmlRootElement(name = "Xmodel")
public class Xmodel {

	@XmlElement(name = "Xnodes", required = true)
	protected Xnodes xnodes;
	@XmlElement(name = "Xbizs", required = true)
	protected Xbizs xbizs;

	public Xnodes getXnodes() {
		return xnodes;
	}

	public void setXnodes(Xnodes value) {
		this.xnodes = value;
	}

	public Xbizs getXbizs() {
		return xbizs;
	}

	public void setXbizs(Xbizs value) {
		this.xbizs = value;
	}
}

 

Xnodes.java内容如下:

 

package test.jaxb;

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Xnodes", propOrder = { "xnode" })
public class Xnodes {

	@XmlElement(name = "Xnode", required = true)
	protected List<Xnode> xnode;

	public List<Xnode> getXnode() {
		if (xnode == null) {
			xnode = new ArrayList<Xnode>();
		}
		return this.xnode;
	}
}
 

4、编写本地的对象模型,我这里的对象模型类结构如下:

 

-src
   -object
      -Biz.java
      -Model.java
      -Node.java

 

     Model.java内容如下:

 

package object;

import java.util.ArrayList;
import java.util.List;

public class Model {
	public List<Node> nodeList=new ArrayList<Node>();
	
	public List<Biz> bizList=new ArrayList<Biz>();
}
  

5、读取.xml后,写到另一个.xml。

 

package object;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import test.jaxb.ObjectFactory;
import test.jaxb.Xbiz;
import test.jaxb.Xmodel;
import test.jaxb.Xnode;

public class test {

	public static void main(String[] args) {
		Model model = read();
		if (null != model) {
			write(model);
		}
	}

	public static Model read() {
		try {
			JAXBContext jc = JAXBContext.newInstance("test.jaxb");
			Unmarshaller u = jc.createUnmarshaller();

			Xmodel Xmodel = (Xmodel) u.unmarshal(new File(
					"C:\\read.xml"));

			Model model = new Model();

			Map<String, Node> nodeSet = new HashMap<String, Node>();
			for (Xnode Xnode : Xmodel.getXnodes().getXnode()) {
				Node node = new Node();
				node.id = Xnode.getId();
				node.type = Xnode.getType();

				nodeSet.put(node.id, node);
				model.nodeList.add(node);
			}

			for (Xbiz bizType : Xmodel.getXbizs().getXbiz()) {
				Biz biz = new Biz();
				biz.id = bizType.getId();
				biz.snode = nodeSet.get(bizType.getSnode());
				biz.tnode = nodeSet.get(bizType.getTnode());

				model.bizList.add(biz);
			}

			System.out.println(model.nodeList.size());
			for (Node node : model.nodeList) {
				System.out.println(node.id + " " + node.type);
			}

			System.out.println();

			System.out.println(model.bizList.size());
			for (Biz biz : model.bizList) {
				System.out.println(biz.id + " " + biz.snode.id + " "
						+ biz.snode.type + " " + biz.tnode.id + " "
						+ biz.tnode.type);
			}

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

	public static void write(Model model) {
		try {
			JAXBContext jc = JAXBContext.newInstance("test.jaxb");
			Marshaller m = jc.createMarshaller();

			ObjectFactory factory = new ObjectFactory();
			Xmodel Xmodel = factory.createXmodel();

			for (Node node : model.nodeList) {
				Xnode Xnode = factory.createXnode();
				Xnode.setId(node.id);
				Xnode.setType(node.type);

				Xmodel.getXnodes().getXnode().add(Xnode);
			}

			Xmodel.setXbizs(factory.createXbizs());
			for (Biz biz : model.bizList) {
				Xbiz bizType = factory.createXbiz();
				bizType.setId(biz.id);
				bizType.setSnode(biz.snode.id);
				bizType.setTnode(biz.tnode.id);

				Xmodel.getXbizs().getXbiz().add(bizType);
			}

			m.marshal(Xmodel, new File(
					"C:\\write.xml"));
		} catch (JAXBException e) {
			e.printStackTrace();
		}
	}
}
打印结果:
3
n1 node2
n2 node3
n3 node4

2
b1 n1 node2 n2 node3
b2 n3 node4 n1 node2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值