Загрузить XmlNodeList в XmlDocument без цикла?
Первоначально я задал этот вопрос наRefactorMyCode , но не получил ответа...
В основном я просто пытаюсь загрузить XmlNodeList
в XmlDocument
, и мне интересно, есть ли более эффективный метод, чем цикл.
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 ответ:
Dim returnXDoc As New XmlDocument(xDoc.NameTable) returnXDoc = xDoc.Clone()
Первая строка здесь избыточна - вы создаете экземпляр XmlDocument, а затем переназначаете переменную:
Dim returnXDoc As XmlDocument = xDoc.Clone()
Это делает то же самое.
Поскольку вы, похоже, вставляете каждый XmlNode из вашего списка узлов в другое место в новом XmlDocument, я не вижу, как вы могли бы сделать это каким-либо другим способом.
Могут быть более быстрые выражения XPath, которые вы могли бы написать, например, предварительно ожидающее выражение XPath с "/ / " почти всегда является самый медленный способ сделать что-то, особенно если ваш XML хорошо структурирован. Вы не показали свой XML, так что я не могу прокомментировать это дальше, однако.