2008-08-15 13 views
2

私はもともと基本的に私はちょうどXmlDocumentXmlNodeListをロードしようとすることだし、ループするよりも効率的な方法があります場合、私は思っていたXmlNodeListをループせずにXmlDocumentにロードしますか?

... RefactorMyCodeにこの質問をしたが、そこには回答を得ませんでした。

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を表示していないので、私は本当にこれ以上コメントすることはできませんでした。

関連する問題