2016-05-30 6 views
0

Ursprüngliche Frage: Ich habe 1000 XMLs mit einer ähnlichen Struktur und ich möchte sie zu einem Master-XML mit den Elementen zusammenführen, die ich übersetzen muss. Sobald ich diesen Master-XML-Code übersetzt habe, möchte ich die Änderungen an die einzelnen XML-Dateien weitergeben. Am Ende werde ich die 1000 XML-Dateien übersetzen lassen.Mischen Sie mehrere XMLs und propagieren Änderungen

Ich bin klar, wie die XMLs mit XSL zusammenführen, aber der Teil, um die Änderungen zurück zu übertragen, es ist, was ich mit kämpfen.

Könnten Sie irgendeine Anleitung geben, wie würden Sie es tun?

Edit2:

Also das, was ich habe, so weit:

die XMLs Merging

Beachten Sie, dass der XMLs völlig verschieden sein kann, muss dies im Hinblick auf die flexibel sein XML-Struktur

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> 

Ergebnis von Merging ist zufriedenstellend, wie ich jedes XML zugeordnet habe (in diesem Beispiel habe ich file1 und file2 verwendet, aber es würde die tatsächlichen xml1 und xml2 Pfade haben), um den Inhalt in extrahiert der XMLcontent-Knoten.

die XMLs Propagierung

Dies ist der Teil, wo ich bin mit kämpfen. Mein Code ist so weit wie folgt:

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 

ich das Teil bin fehlt einfach den Inhalt des XMLcontent Knoten auf einem separaten XML zu extrahieren unter Verwendung der Anzahl, Reihenfolge, Datei Knoten die Originaldateien xml1.txt ersetzen und xml2.txt.

Jede Hilfe würde sehr geschätzt werden.

Danke!

+0

auf die Veränderungen Je Sie an den Master XML machen dies nahezu unmöglich sein kann - (a), warum nicht jeder der Transformation XMLs einzeln? (b) Wenn Sie die Ausgabe des modifizierten Master-XML gut formatiert halten, könnten Sie sie einfach an den Stellen aufteilen, an denen Sie wissen, dass zwei Dateien übereinstimmen? –

+0

Allgemein verwendbare Sprachen wie Vb.Net können den Master-XML-Code aufteilen, indem XSLT-Skript oder String dynamisch geändert werden, um nach benötigten Abschnitten zu filtern und dann die Ausgabe iterativ in Datei zu speichern. – Parfait

Antwort

0

Fügen Sie diese Bibliotheken

Imports System.IO 
    Imports System.Xml.Serialization 

-Code wird wie

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

Danke! Das hat perfekt funktioniert! – daviddgz