Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将文件夹中的XML文件合并为一个XML_Xml_Vb.net_Multithreading_Merge - Fatal编程技术网

将文件夹中的XML文件合并为一个XML

将文件夹中的XML文件合并为一个XML,xml,vb.net,multithreading,merge,Xml,Vb.net,Multithreading,Merge,我有一百个XML,看起来像下面的例子,我想在VB.NET中创建一个代码,将这些文件合并成一个 <report> <Host>10.10.10.4</Host> <Ping>True</Ping> <PingResult>True</PingResult> <start>27/08/2014 14:11:17</start> <end>27/08/2014 14:11:22<

我有一百个XML,看起来像下面的例子,我想在VB.NET中创建一个代码,将这些文件合并成一个

<report>
<Host>10.10.10.4</Host>
<Ping>True</Ping>
<PingResult>True</PingResult>
<start>27/08/2014 14:11:17</start>
<end>27/08/2014 14:11:22</end>
<id>86</id>
<Total>00:00:05</Total>
<success>False</success>
</report>

<report>
<Host>10.10.10.5</Host>
<Ping>True</Ping>
<PingResult>True</PingResult>
<start>27/08/2014 14:11:41</start>
<end>27/08/2014 14:11:58</end>
<id>86</id>
<Total>00:00:17</Total>
<success>False</success>
</report>
我的计划是对每个XML使用,读取所有XML,然后创建一个新的XML

Dim directory As System.IO.DirectoryInfo = New System.IO.DirectoryInfo(Me.FilePath + "\report\")
Dim xmlFiles As System.IO.FileInfo() = directory .GetFiles("*.xml")
For Each xmlFile As System.IO.FileInfo In xmlFiles
  //To Do
Next

我想出了一个解决方案,我必须创建一个函数来合并输出文件,另一个函数来创建要合并的文件列表,还有我在这里找到的xsl,这要感谢joefawcett

Private Sub MergeReports(filename As String, stylesheet As String)
Dim doc As XmlDocument = New XmlDocument()
doc.Load(filename)

Dim root As XmlElement = doc.DocumentElement
Dim elemList As XmlNodeList = root.GetElementsByTagName("Item")
If elemList.Count.Equals(Me.TotalItems) Then
  'Create the XslTransform and load the style sheet.
  Dim settings As New XsltSettings(True, True)
  Dim xslt As New XslCompiledTransform()
  xslt.Load(stylesheet, settings, Nothing)
  ' Execute the transform and output the results to a file.
  xslt.Transform(filename, "C:\NW\out\report\output.xml")
End If
End Sub


Private Sub CreateList()
Try
  If (Not System.IO.File.Exists(Me.FilePath + "\report\list.xml")) Then
    Dim writer As New XmlTextWriter(Me.FilePath + "\report\list.xml", Nothing)
    writer.WriteStartDocument()
    writer.WriteStartElement("Data")
    writer.WriteAttributeString("Root", "Root")
    writer.WriteStartElement("fileList")
    writer.WriteElementString("Item", Me.HostName.ToString)
    writer.WriteEndElement()
    writer.Close()
  Else
    Dim xmlDoc As XmlDocument = New XmlDocument()
    xmlDoc.Load(Me.FilePath + "\report\list.xml")
    With xmlDoc.SelectSingleNode("//Data/fileList").CreateNavigator().AppendChild()
      .WriteElementString("Item", Me.FilePath + "\report\" + Me.HostName.ToString)
      .Close()

    End With
    xmlDoc.Save(Me.FilePath + "\report\list.xml")
  End If
Catch ex As Exception
  Console.WriteLine(ex.Message)
End Try
End Sub
XSL


文件列表:

<Data Root="Root">
  <List>
    <Item>C:\NW\out\report\File1.xml</Item>
    <Item>C:\NW\out\report\File2.xml</Item>
    <Item>C:\NW\out\report\File3.xml</Item>
  </List>
</Data>

C:\NW\out\report\File1.xml
C:\NW\out\report\File2.xml
C:\NW\out\report\File3.xml

能否列出一些您已经尝试过的代码?
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="/">
  <xsl:element name="{Data/@Root}">
   <xsl:apply-templates select="Data/List/Item"/>
  </xsl:element>
 </xsl:template>
<xsl:template match="Item">    
 <xsl:copy-of select="document(.)"/>
</xsl:template>
<Data Root="Root">
  <List>
    <Item>C:\NW\out\report\File1.xml</Item>
    <Item>C:\NW\out\report\File2.xml</Item>
    <Item>C:\NW\out\report\File3.xml</Item>
  </List>
</Data>