下面的例子通过外部实体引用,将文件order1.xml与文件order2.xml合并为一个文件directory.xml清单1. 要合并的xml文档order1.xml:<?xml version="1.0" encoding="GB2312"?><order>
  <item>
    <itemNumber>ksu-0384</itemNumber>
    <description>LCD液晶显示器</description>
    <quantity>1</quantity>
    <price>358.00</price>
  </item>
    <item>
    <itemNumber>ksu-0511</itemNumber>
    <description>音箱</description>
    <quantity>1</quantity>
    <price>16.50</price>
  </item>
    <item>
    <itemNumber>ksu-7710</itemNumber>
    <description>鼠标</description>
    <quantity>1</quantity>
    <price>8.50</price>
  </item>
</order>清单2. 要合并的xml文档order2.xml:<?xml version="1.0" encoding="GB2312"?><order>
  <item>
    <itemNumber>ksu-0652</itemNumber>
    <description>双飞燕键盘</description>
    <quantity>1</quantity>
    <price>35.00</price>
  </item>
    <item>
    <itemNumber>ksu-7720</itemNumber>
    <description>intel CPU</description>
    <quantity>1</quantity>
    <price>1650.00</price>
  </item>
    <item>
    <itemNumber>ksu-7010</itemNumber>
    <description>迈拓硬盘</description>
    <quantity>1</quantity>
    <price>850.00</price>
  </item>
</order>清单3. 输出文档directory.xml,黑体字部分为实体声明及其引用:<?xml version="1.0"?>
<!DOCTYPE directory [
   <!ENTITY disclaimer1 SYSTEM "./order1.xml">
   <!ENTITY disclaimer2 SYSTEM "./order2.xml">
]>
<directory>
   &disclaimer1;
   &disclaimer2;
</directory>当符合 XML 1.0 的处理器读取文档时,就会扩展实体,用它的内容代替引用,因此完整的文档如下所示。清单4. 带有扩展实体的文档显示(IE6中):  <?xml version="1.0" ?> 
  <!DOCTYPE directory (View Source for full doctype...)> 
- <directory>
 - <order>
  - <item>
     <itemNumber>ksu-0384</itemNumber> 
     <description>LCD液晶显示器</description> 
     <quantity>1</quantity> 
     <price>358.00</price> 
    </item>
  - <item>
     <itemNumber>ksu-0511</itemNumber> 
     <description>音箱</description> 
     <quantity>1</quantity> 
     <price>16.50</price> 
    </item>
  - <item>
     <itemNumber>ksu-7710</itemNumber> 
     <description>鼠标</description> 
     <quantity>1</quantity> 
     <price>8.50</price> 
    </item>
   </order>
 - <order>
   - <item>
     <itemNumber>ksu-0652</itemNumber> 
     <description>双飞燕键盘</description> 
     <quantity>1</quantity> 
     <price>35.00</price> 
    </item>
  - <item>
     <itemNumber>ksu-7720</itemNumber> 
     <description>intel CPU</description> 
     <quantity>1</quantity> 
     <price>1650.00</price> 
    </item>
  - <item>
     <itemNumber>ksu-7010</itemNumber> 
     <description>迈拓硬盘</description> 
     <quantity>1</quantity> 
     <price>850.00</price> 
    </item>
   </order>
  </directory>

解决方案 »

  1.   

    public class MergeXML{
    Private Boolean is Merging (String mainFileName, String sub Filename) throws Exception {
     Boolean isOver = false;
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
     Document Builder db = null;
     Try {
      Db = dbf.newDocumentBuilder ();
     } Catch (ParserConfigurationException pce) {
      System.err.println(pce); //出现异常时,输出异常信息
     }
     Document doc_main = null,doc_vice = null;
     //获取两个XML文件的Document。
     Try {
      Doc_main = db.parse (mainFileName);
      Doc_vice = db.parse (sub Filename);
     } Catch (DOM Exception dom) {
      System.err.println (dom.getMessage ());
     } Catch (Exception ioe) {
      System.err.println (ioe);
     }
     //获取两个文件的根元素。
     Element root_main = doc_main.getDocumentElement ();
     Element root_vice = doc_vice.getDocumentElement ();
     //下面添加被合并文件根节点下的每个元素
     Novelist message Items = root_vice.getChildNodes ();
     Int item_number = messageItems.getLength ();
     //如果去掉根节点下的第一个元素,比如<所属管理系统> ,那么i从3开始。否则i从1开始。
     For (int i=1; i < item_number; i=i+2 ) {
      //调用dupliate(),依次复制被合并XML文档中根节点下的元素。 
      Element messageItem = (Element) messageItems.item (i);
      IsOver = dupliate (doc_main, root_main, messageItem);
     }
     //调用 write To(),将合并得到的Document写入目标XML文档。
     Boolean isWritten = write To (doc_main, mainFileName);
     Return isOver && isWritten; 
    }//主函数
    Public static void main (String [] args) throws Exception {
     Boolean is done = is Merging ("D:/a.xml","D:/b.xml");
     If (is Done) System.out.println ("XML files have been merged.");
     Else System.out.println ("XML files have NOT been merged.");

    }
      

  2.   

    Private Boolean dupliate (Document doc_dup, Element father, Element son) throws Exception {
     Boolean is done = false;
     String son_name = son.getNodeName ();
     Element sub ITEM = doc_dup.createElement (son_name);
     //复制节点的属性
     If (son.hasAttributes ()){
      NamedNodeMap attributes = son.getAttributes ();
      For (int i=0; i < attributes.getLength () ; i ++){
       String attribute_name = attributes. Item (i). GetNodeName ();
       String attribute_value = attributes. Item (i). GetNodeValue ();
       SubITEM.setAttribute (attribute_name, attribute_value);
      }
     }
     Father.appendChild (sub ITEM);
     //复制节点的值
     Text value son = (Text) son.getFirstChild ();
     String nodevalue_root = "";
     If (value_son! = null && value_son.getLength () > 0) nodevalue_root = (String) value_son.getNodeValue ();
     Text valuenode_root = null;
     If ((nodevalue_root! = null)&&(nodevalue_root.length () > 0)) valuenode_root = doc_dup.createTextNode (nodevalue_root);
     If (valuenode_root! = null && valuenode_root.getLength () > 0) subITEM.appendChild (valuenode_root);
     //复制子结点
     Novelist sub_messageItems = son.getChildNodes ();
     int sub_item_number = sub_messageItems.getLength();
     if (sub_item_number < 2){
      //如果没有子节点,则返回
      Is done = true;
     }
     Else {
      For (int j = 1; j < sub_item_number; j=j+2) {
       //如果有子节点,则递归调用本方法 
       Element sub_messageItem = (Element) sub_messageItems.item (j);
       Is done = dupliate (doc_dup, subITEM, sub_messageItem);
      }
     }
     Return is done;
    }Private Boolean write To (Document doc, String fileName) throws Exception {
     Boolean isOver = false;
     DOM Source doms = new DOM Source (doc);
     File f = new File (fileName);
     Stream Result sr = new Stream Result (f);
     Try
     {
      Transformer Factory tf=TransformerFactory.newInstance ();
      Transformer t=tf.newTransformer ();
      Properties properties = t.getOutputProperties ();
      Properties.setProperty (OutputKeys.ENCODING,"GB2312");
      T.setOutputProperties (properties);
      T.transform (doms, sr);
      IsOver = true;
     }
     Catch (TransformerConfigurationException tce)
     {
      Tce.printStackTrace ();
     }
     Catch (Transformer Exception te)
     {
      Te.printStackTrace ();
     }
     Return isOver;
    }