2008-08-15 8 views
2

Первоначально я задал этот вопрос на RefactorMyCode, но не получил ответов там ...Загрузите XmlNodeList в XmlDocument без цикла?

В основном я просто пытаюсь загрузить 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 

ответ

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

Первая строка избыточен - вы создаете экземпляр XmlDocument, то переназначение переменной:

Dim returnXDoc As XmlDocument = xDoc.Clone() 

Это делает то же самое.

Увидев, что вы, кажется, вставляете каждый XmlNode из списка узлов в другое место в новом XmlDocument, тогда я не вижу, как вы могли бы сделать это любым другим способом.

Бывают более быстрые выражения XPath, которые вы могли бы написать, например, предварительное ожидающее выражение XPath с «//» - это почти всегда самый медленный способ сделать что-то, особенно если ваш XML хорошо структурирован. Вы не показывали свой XML, поэтому я не мог даже прокомментировать это дальше.