Frage

Ich habe ursprünglich diese Frage auf RefactorMyCode, an , bekam aber keine Antworten gibt...

Im Grunde bin ich nur versuchen Sie zu laden ein XmlNodeList in einer XmlDocument und ich Frage mich, ob es eine effizientere Methode als looping.

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
War es hilfreich?

Lösung

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

Die erste Zeile ist hier überflüssig - erstellen Sie eine Instanz von XmlDocument, dann die Neuzuweisung der Variablen:

Dim returnXDoc As XmlDocument = xDoc.Clone()

Dieser macht das gleiche.

Zu sehen, wie Sie angezeigt werden, um das einfügen jedes XmlNode aus Ihrer Liste von Knoten in einem anderen Ort in der new XmlDocument dann kann ich nicht sehen, wie Sie es möglicherweise tun Sie dies auf andere Weise.

Es kann eine schnellere XPath-Ausdrücke, die Sie schreiben könnte, zum Beispiel pre-pending einen XPath-Ausdruck, der mit "//" ist fast immer der langsamste Weg, um etwas zu tun, vor allem, wenn Ihr XML ist gut strukturiert.Sie haben nicht gezeigt, Ihre XML so konnte ich nicht wirklich kommentieren dies jedoch weiter.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top