合并多个XML并传播更改

时间:2016-05-30 20:06:06

标签: xml vb.net xslt

原始问题: 我有1000个具有类似结构的XML,我想将它们合并为一个主XML,其中包含我需要翻译的元素。一旦我将这个主XML转换成了我想要将更改传播回各个XML,所以最后我将翻译1000个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

我错过了使用Number,order,文件节点将XML内容节点的内容简单地提取到单独的XML来替换原始文件xml1.txt和xml2.txt的部分。

任何帮助都将受到高度赞赏。

谢谢!

1 个答案:

答案 0 :(得分: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