Pregunta

Originalmente hice esta pregunta en RefactorMiCode, pero no obtuve respuestas allí...

Básicamente solo intento cargar un XmlNodeList en una XmlDocument y me preguntaba si existe un método más eficiente que el bucle.

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
¿Fue útil?

Solución

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

La primera línea aquí es redundante: está creando una instancia de un XmlDocument y luego reasigna la variable:

Dim returnXDoc As XmlDocument = xDoc.Clone()

Esto hace lo mismo.

Dado que parece estar insertando cada XmlNode de su lista de nodos en un lugar diferente en el nuevo XmlDocument, no veo cómo podría hacerlo de otra manera.

Es posible que haya expresiones XPath más rápidas que pueda escribir; por ejemplo, anteponer una expresión XPath con "//" es casi siempre la forma más lenta de hacer algo, especialmente si su XML está bien estructurado.Sin embargo, no ha mostrado su XML, por lo que no podría comentar más sobre esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top