xml的生成与解析

最近负责公司项目的一部分,现在服务器与客户端的报文传送基本都是xml格式的,下面就以dom4j技术为例,讲解一下关于xml的生成以及解析

 

1.生成xml

对此不同的人有不同的要求,我们可以将生成的xml保存到文件中,也可以直接返回一个xml字符串

(1)我们可以使用DocumentHelper的createDocument()方法来创建一个Document对象doc

(2)我们可以将xml看成是个树结构,首先添加xml中的根节点root,通过Document对象doc的addElement()方法来实现,而其结果是个Element类型的。

(3)通过相应对象的方法依次添加子节点及其属性和各自子节点信息,在此不详细说明,附上代码为上。

//生成xml字符串
private static StringWriter createXML(){
StringWriter sendXml=new StringWriter();
                XMLWriter xw;

Document doc=DocumentHelper.createDocument();
//增加根节点
Element business =doc.addElement("business");
//为根节点添加属性
business.addAttribute("id", "10008");
business.addAttribute("comment", "发票开具");
//为根节点增加元素body
Element body=business.addElement("body");
body.addAttribute("yylxdm", "1");//添加属性
//为子节点body添加元素
Element kpzdbs=body.addElement("kpzdbs");
Element fplxdm=body.addElement("fplxdm");
Element fpqqlsh=body.addElement("fpqqlsh");
fpqqlsh.setText("发票请求流水号");
Element kplx=body.addElement("kplx");
kplx.setText("开票类型");
Element xhdwsbh=body.addElement("xhdwsbh");
Element xhdwmc=body.addElement("xhdwmc");
xhdwsbh.setText("销货单位识别号");
xhdwmc.setText("销货单位名称");

Element fyxm =body.addElement("fyxm ");
fyxm.addAttribute("count", "1");//添加属性
//为body的子节点fyxm增加元素
Element group =body.addElement("group ");
group.addAttribute("xh", "1");//添加属性
//为body的子节点fyxm的子节点group增加元素
Element fphxz=body.addElement("fphxz");
Element spmc=body.addElement("spmc");

kpzdbs.setText("开票终端标识");
//kpzdbs.setText(b1.getKpzdbs());
fplxdm.setText("发票类型代码");
//fplxdm.setText(b1.getFplxdm());

//规范格式
OutputFormat format = OutputFormat.createPrettyPrint();
//设置输出编码
format.setEncoding("gbk");
   xw=new XMLWriter(sendXml,format);
   try {
xw.write(doc);
xw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
log.error("xml生成不成功!");
e.printStackTrace();

return sendXml;
}

//保存为文件,则创建部分基本相同,而在输出部分,需要改成

xw=new XMLWriter(new File(保存路径或名称),format);

 

2.解析字符串形式的xml,至于从文件中获取xml将其解析,相信网上有很多,暂不说明。

xml形式为:String xml="<?xml version='1.0' encoding='gbk'?>"
+ "<business id='10008' comment='发票开具'>"
+ "<body yylxdm='1'>"
+ "<returncode>返回代码</returncode>"
+ "<returnmsg>返回信息</returnmsg>"
+ "<returndata>"
+ "<fpdm>发票代码</fpdm>"
+ "<fphm>发票号码</fphm>"
+ "<kprq>开票日期</kprq>"
+ "<skm>税控码</skm>"
+ "<jym>校验码</jym>"
+ "<ewm>二维码</ewm>"
+ "</returndata>"
+ "</body>"
+ "</business>";  

具体实现也是如数一般,先获得其根节点,然后依次获得属性和子节点信息。多余的不说,下面将代码发了为上。

private void pareseXml(String xml){      
//创建SAXReader的对象sr
SAXReader sr=new SAXReader();
StringReader s = new StringReader(xml);
        InputSource is = new InputSource(s);
Document doc=null;
try {
//通过sr对象的read方法加载xml,获取document对象
doc=sr.read(is);
if(doc==null) 
        return; 
//doc = DocumentHelper.parseText(xml); 
//通过doc对象获取根节点business
Element business=doc.getRootElement();
//System.out.println(business.getName());//根节点的name
//获取根节点的属性
List<Attribute> bus=business.attributes();
for(Attribute bu:bus){
System.out.println(bu.getName()+bu.getValue());
}
//通过business对象的elementIterator()方法获取迭代器
Iterator it=business.elementIterator();
//遍历迭代器,获取根节点的信息
while(it.hasNext()){
//得到每一个body
Element body=(Element) it.next();
//获取body的属性名与属性值
List<Attribute> bodys=body.attributes();
for(Attribute b:bodys){
//System.out.println(body.getName());//根节点的子节点的name
System.out.println(b.getName()+b.getValue());
}
//通过body对象的elementIterator()方法获取迭代器,获取body的节点名与节点值
Iterator itt=body.elementIterator();
while(itt.hasNext()){
//得到每一个body的节点
Element bos=(Element) itt.next();
//System.out.println(bos.getName()+bos.getStringValue());
//通过bos对象的elementIterator()方法获取迭代器,获取bos的节点名与节点值
Iterator its=bos.elementIterator();
while(its.hasNext()){
//得到每一个returndata(包含子节点)的节点
Element returndata=(Element) its.next();
//System.out.println(bos.getName());//根节点的子节点的子节点的name
System.out.println(returndata.getName()+returndata.getStringValue());
}
}
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
log.error("解析失败 ");
e.printStackTrace();
}
}

 

本次内容相对简单,因时间原因叙述比较少,下次之后会又有更多更新更深的东西分享给大家,希望多多支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值