将 XmlNodeList 加载到 XmlDocument 中而不循环?
Posted
技术标签:
【中文标题】将 XmlNodeList 加载到 XmlDocument 中而不循环?【英文标题】:Load an XmlNodeList into an XmlDocument without looping? 【发布时间】:2010-09-05 23:27:04 【问题描述】:我最初在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,所以我无法对此进一步评论。
【讨论】:
以上是关于将 XmlNodeList 加载到 XmlDocument 中而不循环?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 c# 中查找/计数 xmlnodelist - xmlnodelist.childnodes.asqueryable() 是一个好方法吗?