2016-05-30 42 views
0

原始問題: 我有1000個具有相似結構的XML,我想將它們合併到主XML中並使用我需要轉換的元素。一旦我將這個主XML轉換後,我想將這些更改傳播回各個XML,因此最終我將轉換1000個XML。合併幾個XML並傳播更改

我很清楚如何使用XSL來合併XML,但傳播變化的部分回來了,這正是我所苦苦掙扎的。

你能給你提供任何指導嗎?

EDIT2:

所以這個我到目前爲止什麼:

合併個XML

注意,個XML可能是完全不同的,這需要靈活來講XML結構。

Dim XML1 = XElement.Load("D:\xml1.txt") 
Dim XML2 = XElement.Load("D:\xml2.txt") 
//datasetXMLv2 contains a table Entry with 4 columns: number, Order, File, ContentXML) 
//contentXML column is set as an object, all other columns are strings 

DatasetXMLv2.Tables("Entry").Rows.Add(New Object() {"1", "order1", "file1", XML1}) 
DatasetXMLv2.Tables("Entry").Rows.Add(New Object() {"2", "order2", "file2", XML2}) 

DatasetXMLv2.Tables("Entry").WriteXml("d:\merge.xml") 

XML1:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<item type="product"> 
    <key>Key1</key> 
    <field><![CDATA[product name]]></field> 
    <comment></comment> 
</item> 

XML2:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<item type="product"> 
    <key>Key2</key> 
    <field><![CDATA[product name2]]></field> 
    <desc><![CDATA[description2]]></desc> 
    <comment></comment> 
    <img>http://myimage</img> 
</item> 

的merge.xml

<?xml version="1.0" standalone="yes"?> 
<MergeXMLv2> 
    <Entry> 
    <Number>1</Number> 
    <Order>order1</Order> 
    <File>file1</File> 
    <XMLContent msdata:InstanceType="System.Xml.Linq.XElement, System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
     <item type="product"> 
     <key>Key1</key> 
     <field><![CDATA[product name]]></field> 
     <comment> 
     </comment> 
     </item> 
    </XMLContent> 
    </Entry> 
    <Entry> 
    <Number>2</Number> 
    <Order>order2</Order> 
    <File>file2</File> 
    <XMLContent msdata:InstanceType="System.Xml.Linq.XElement, System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
     <item type="product"> 
     <key>Key2</key> 
     <field><![CDATA[product name2]]></field> 
     <desc><![CDATA[description2]]></desc> 
     <comment> 
     </comment> 
     <img>http://myimage</img> 
     </item> 
    </XMLContent> 
    </Entry> 
<MergeXMLv2> 

正如你所看到的,合併的結果是令人滿意的因爲我有每個XML映射(在這個例子中,我已經使用file1和file2,但它將有實際的xml1和xml2路徑),然後提取存儲在XMLcontent節點。

傳播的個XML

這是我與掙扎的部分。到目前爲止我的代碼如下:

Dim mergeXML As XmlDocument 
Dim nodelist As XmlNodeList 
Dim node As XmlNode 
mergeXML = New XmlDocument 

mergeXML.Load("D:\merge.xml") 
nodelist = mergeXML.SelectNodes("//Entry") 

For Each node In nodelist 
    Dim nodeNumer = node.ChildNodes(0).InnerText 
    Dim nodeOrder = node.ChildNodes(1).InnerText 
    Dim nodeFile = node.ChildNodes(2).InnerText 
    Dim nodeXMLcontent = node.ChildNodes(3).InnerText 
Next 

我缺少的一部分,只需使用數量,順序,文件中的節點來替換原始文件xml1.txt提取XMLcontent節點到一個單獨的XML內容和xml2.txt。

任何幫助將不勝感激。

謝謝!

+0

根據您對主XML的變化,這可能是幾乎是不可能的 - (一)爲什麼不改變各自的單獨的XML? (b)如果您保持修改後的主XML的輸出格式良好,您可以將它分割到您知道兩個文件符合的點上? –

+0

Vb.Net等通用語言可以通過動態更改XSLT腳本或字符串來拆分主XML,以便按需要的部分進行過濾,然後迭代地將輸出保存到文件。 – Parfait

回答

0

添加這些庫

Imports System.IO 
    Imports System.Xml.Serialization 

代碼就會像

Dim mergeXML As XmlDocument 
    Dim nodelist As XmlNodeList 
    Dim node As XmlNode 
    mergeXML = New XmlDocument 

    mergeXML.Load("D:\merge.xml") 
    nodelist = mergeXML.SelectNodes("//Entry") 

    For Each node In nodelist 
     Dim nodeNumber = node.ChildNodes(0).InnerText 
     Dim nodeOrder = node.ChildNodes(1).InnerText 
     Dim nodeFile = node.ChildNodes(2).InnerText 
     Dim nodeXMLcontent = node.LastChild.FirstChild 

     Dim objStreamWriter As New StreamWriter("C:\ExtractedXML_" & nodeNumber & nodeOrder & nodeFile & ".txt") 
     Dim x As New XmlSerializer(nodeXMLcontent.GetType) 
     x.Serialize(objStreamWriter, nodeXMLcontent) 
     objStreamWriter.Close() 
    Next 
+0

謝謝!這工作完美! – daviddgz