关于xml:将XmlNodeList加载到XmlDocument中而不循环?

关于xml:将XmlNodeList加载到XmlDocument中而不循环?

Load an XmlNodeList into an XmlDocument without looping?

我最初在RefactorMyCode上问了这个问题,但那里没有任何回应。

基本上,我只是尝试将XmlNodeList加载到XmlDocument中,我想知道是否有比循环更有效的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Private Function GetPreviousMonthsXml(ByVal months As Integer, ByVal startDate As Date, ByVal xDoc As XmlDocument, ByVal path As String, ByVal nodeName As String) As XmlDocument
    '' build xpath string with list of months to return
    Dim xp As New StringBuilder("//")
    xp.Append(nodeName)
    xp.Append("[")
    For i As Integer = 0 To (months - 1)
      '' get year and month portion of date for datestring
      xp.Append("starts-with(@Id, '")
      xp.Append(startDate.AddMonths(-i).ToString("yyyy-MM"))
      If i < (months - 1) Then
       xp.Append("') or")
     Else
       xp.Append("')]")
     End If
   Next

   '' *** This is the block that needs to be refactored ***
   '' import nodelist into an xmldocument
   Dim xnl As XmlNodeList = xDoc.SelectNodes(xp.ToString())
   Dim returnXDoc As New XmlDocument(xDoc.NameTable)
   returnXDoc = xDoc.Clone()
   Dim nodeParents As XmlNodeList = returnXDoc.SelectNodes(path)
   For Each nodeParent As XmlNode In nodeParents
     For Each nodeToDelete As XmlNode In nodeParent.SelectNodes(nodeName)
       nodeParent.RemoveChild(nodeToDelete)
     Next
   Next

   For Each node As XmlNode In xnl
     Dim newNode As XmlNode = returnXDoc.ImportNode(node, True)
     returnXDoc.DocumentElement.SelectSingleNode("//" & node.ParentNode.Name &"[@Id='" & newNode.Attributes("Id").Value.Split("-")(0) &"']").AppendChild(newNode)
   Next

   '' *** end ***
   Return returnXDoc
End Function

1
2
Dim returnXDoc As New XmlDocument(xDoc.NameTable)
returnXDoc = xDoc.Clone()

第一行是多余的-您正在创建XmlDocument的实例,然后重新分配变量:

1
Dim returnXDoc As XmlDocument = xDoc.Clone()

这也一样。

看来您似乎将节点列表中的每个XmlNode插入新XmlDocument中的不同位置,那么我看不到您怎么可能以其他方式进行此操作。

您可能会编写更快的XPath表达式,例如,在XPath表达式之前加上" //"几乎总是最慢的方法,尤其是在XML结构良好的情况下。 您尚未显示您的XML,所以我无法对此进一步发表评论。


推荐阅读