我自己写的XML to XML 转换的工具

一、xml to xml 转换原理

ESB中,很多时候需要不同格式xml文件之间的数据转换,下面就是一种根据规则文件将源xml转换成符合规则文件的目标xml文件,同时将源xml文件中的数据迁移至生成的目标xml文件中。

用户首先根据schema里规定的规则文件应该含有的元素和源xml写出正确的规则文件,程序根据规则文件里目标文件的xml结构生成目标xml文件。系统会在内部首先根据schema文件验证写的规则文件是否符合schema标准,如果不符合,将直接抛出异常信息;验证通过才进行目标文件的生成。

二、规则文件结构

2.1.     根节点:rule,这是规则文件的根节点,在其schema里定义为<xs:element name="rule" type="ruletype"></xs:element>

2. 2  子节点:children,可以有多个,至少一个。每一个children节点表示了一个源xml文件节点值和一个目标xml节点的构造。Children节点包括以下四个节点,其中parent_fromparent_to节点可以省略。

2.2.1   Parent_from:表示源xml文件节点的父节点,可以省略。如果省略,则用from节点表示源xml节点的绝对路径。Parent_from节点必须是个绝对路径,即必须以“/”开始。

2.2.2   Parent_to:表示将要构造的目标xml文件节点的父节点,可以省略。如果省略,则用to节点表示目标xml节点的绝对路径。Parent_to节点必须是个绝对路径,即必须以“/”开始。

2.2.3   From:表示源xml文件节点,如果有Parent_from节点,则源文件节点是Parent_from+/+from节点,取它的text值做为目标xml文件节点的值。如果没有parent_from节点,则源文件节点就是这个from表示的节点,而且此时必须用绝对路径表示,即必须以“/”开始,因为此时它没有父节点。

2.2.4   To:表示目标xml文件节点,如果有Parent_to节点,则要构造的目标文件节点是Parent_to+/+to节点,并取源节点的值做为此节点的值。如果没有parent_to节点,则要构造的节点就是这个to表示的节点,此时必须用绝对路径表示,即必须以“/”开始,因为此时它没有父节点。

三、附schema文件rule.xsd

1表示规则文件对应的schema文件。

<?xml version="1.0" encoding="UTF-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">

       <xs:simpleType name="stringtype">

              <xs:restriction base="xs:string"></xs:restriction>

       </xs:simpleType>

 

       <xs:complexType name="childrentype">

              <xs:sequence>

                     <xs:element name="parent_from" type="stringtype" minOccurs="0" maxOccurs="1"></xs:element>

                     <xs:element name="parent_to" type="stringtype" minOccurs="0" maxOccurs="1"></xs:element>

                     <xs:element name="from" type="stringtype" minOccurs="1" maxOccurs="1"></xs:element>

                     <xs:element name="to" type="stringtype" minOccurs="1" maxOccurs="1"></xs:element>

              </xs:sequence>

       </xs:complexType>

       <xs:complexType name="ruletype">

              <xs:sequence>

                     <xs:element name="children" type="childrentype" minOccurs="1" maxOccurs="unbounded"></xs:element>

              </xs:sequence>

       </xs:complexType>

      

       <xs:element name="rule" type="ruletype"></xs:element>

</xs:schema>

 

 

1 rule.xsd

 

 

 

 

 

 

四、应用举例:

1.xml文件source.xml如图2所示。

<?xml version="1.0" encoding="GB2312"?>

 

<greetings attribute="greeting">

      

       <greeting id="greeting1" parent="g1">

              <property name="p1">

                   p 1p 1p1p1

                     <greeting

                            class="b1" />

              </property>

              <property name="p2">

              g p2

                     <greeting

                            class="b2" />

              </property>

       </greeting>

       <greeting id="greeting2" parent="g1">

              <property name="p3">

                     g p311 dvvvvvdddd  dd

              </property>

              <property name="p4">

                     pppp 444

              </property>

             

       </greeting>

</greetings>

2 source.xml

 

 

 

 

 

 

 

 

 

2.规则文件如图3所示。

<?xml version="1.0" encoding="UTF-8"?>

<rule>   

       <children>

              <parent_from>/greetings/greeting[@id='greeting1']</parent_from>

              <parent_to>/hello/goods/good[@id='1']</parent_to>

              <from >property[@name='p1']</from>

              <to >property[@name='p1']</to>

       </children>

        <children>

              <parent_from>/greetings/greeting[@id='greeting1']</parent_from>

              <parent_to>/hello/goods/good[@id='2']</parent_to>

              <from >property[@name='p2']</from>

              <to >property[@name='p2']</to>

       </children>

       <children>

              <parent_from>/greetings/greeting[@id='greeting2']</parent_from>

              <parent_to>/hello/goods/good[@id='3']</parent_to>

              <from >property[@name='p3']</from>

              <to >property[@name='p3']</to>

       </children> 

</rule>

 

3 规则文件rule.xml

 

 

 

 

 

 

 

 

 

 

 

 

3.程序根据规则文件rule.xml生成图4所示的目标xml文件 result.xml

<?xml version="1.0" encoding="UTF-8"?>

<hello>

  <goods>

    <good id="1">

      <property name="p1">p 1p 1p1p1</property>

    </good>

    <good id="2">

      <property name="p2">g p2</property>

    </good>

    <good id="3">

      <property name="p3">g p311 dvvvvvdddd dd</property>

    </good>

  </goods>

</hello>

4 result.xml

4. 测试类

public class MainTest extends  TestCase{

       public void test(){

              Parser parser = new Parser();

       //设置规则文件的schema文件绝对路径

       parser.setRuleSchemaPath("F:\\ESB\\example\\rule.xsd");

       //设置规则文件的绝对路径

              parser.setRulePath("F:\\ESB\\example\\rule.xml");

       //设置源文件的绝对路径

              parser.setSourcePath("F:\\ESB\\example\\source.xml");

       //设置要生成的目标xml文件的绝对路径

              parser.setTargetFileFullName("F:\\ESB\\example\\result.xml");

       //是否成功生成XML文件

              if(parser.toXML()){

                     System.out.println("成功生成XML!!!");

              }else{

                     System.out.println("生成XML出现错误!!!");

              }

             

       }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值