2008-08-15 64 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,所以我不能进一步评论这一点。