Сведения о вопросе

HOLY

18:54, 16th August, 2020

Теги

Загрузить XmlNodeList в XmlDocument без цикла?

Просмотров: 520   Ответов: 1

Я изначально задал этот вопрос на 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



  Сведения об ответе

PROGA

06:57, 7th August, 2020

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

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

Dim returnXDoc As XmlDocument = xDoc.Clone()

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться