2015-10-06 94 views
0

這裏是XML文件和我的代碼。我需要更改<Value>標記中的數字2509。下面的代碼找到<Value>SchoolFiles</Value>,但之後跳出循環。我知道有一個更好的方式循環。如何使用VB.NET編輯XML文件

XML文件

<Filters> 
    <Filter> 
     <Name>ViewFolders</Name> 
     <ApplyToFiles>0</ApplyToFiles> 
     <ApplyToDirs>1</ApplyToDirs> 
     <MatchType>None</MatchType> 
     <MatchCase>0</MatchCase> 
     <Conditions> 
      <Condition> 
       <Type>0</Type> 
       <Condition>0</Condition> 
       <Value>SchoolFiles</Value> 
      </Condition> 
      <Condition> 
       <Type>0</Type> 
       <Condition>0</Condition> 
       <Value>DataImportFiles</Value> 
      </Condition> 
      <Condition> 
       <Type>0</Type> 
       <Condition>0</Condition> 
       <Value>2509</Value> 
      </Condition> 
     </Conditions> 
    </Filter> 
</Filters> 
Dim FileZillaXMLFilterFile As String = "C:\Users\Development\AppData\Roaming\FileZilla\filters.xml" 
Dim myXmlDocument As XmlDocument = New XmlDocument() 
myXmlDocument.Load(FileZillaXMLFilterFile) 
Dim MyNode As XmlNode 
Dim node As XmlNode 
node = myXmlDocument.SelectSingleNode("//Filters") 
'node = myXmlDocument.SelectSingleNode("//Filters/Filter/Conditions/Condition/Value") 
For Each book As XmlNode In node.ChildNodes 

    Debug.Print(book.InnerText) '= Session("iCustID").ToString() 
    If Microsoft.VisualBasic.Left(book.InnerText, 11) = "ViewFolders" Then 
     For Each node4 As XmlNode In book.ChildNodes 
      If node4.Name = "Conditions" Then 
       'Debug.Print(node4.LastChild.Name) 

       For Each node5 As XmlNode In node4.ChildNodes 
        Debug.Print(node5.Name) 
        For Each node6 As XmlNode In node5.ChildNodes 
         Debug.Print(node6.Name) 
         If node6.Name = "Value" Then 
          Debug.Print(node6.InnerText) 
          For Each node7 As XmlNode In node6.ChildNodes 
           If node7.InnerText <> "SchoolFiles" And node7.InnerText <> "DataImportFiles" Then 
            'need to change 2509 to another numnber 
            Debug.Print(node7.InnerText) 
           End If 
          Next 
         End If 
        Next 
       Next 
      End If 
     Next 
    End If 
Next 
+1

更改xml中的任何值都需要重寫整個xml文件。 – nelek

+0

https://msdn.microsoft.com/en-us/library/system.xml.xmlnode.selectsinglenode(v=vs.110).aspx –

回答

1

訣竅這樣做是使用XPath找到合適的節點,然後改變它的價值。然後,您可以使用XmlDocument重寫該文件。所需要的節點的XPath是:

/Filters/Filter/Conditions/Condition[Value != 'SchoolFiles' and Value != 'DataImportFiles']/Value 

在這裏,我複製你的檢查SchoolFiles和DataImportFiles的邏輯,但可能有更好的方法來集中在正確的節點上。例如,它可能基於它的索引。或者如果類型節點具有唯一值,則可以使用該值。

我在你的代碼中看到你已經在使用SelectSingleNode。你可以使用這個XPath來節省大量的循環。您可以將節點的Value屬性設置爲新數字,並使用Save方法保存XMLDocument。

像XMLSpy這樣的工具在獲取XPath正確方面很有用。 W3Schools(http://www.w3schools.com/xml/)是學習XML和XPath的好地方。

+0

這個.XML文件的問題之一是它有重複標籤,我剛剛顯示了它的一部分。所以你的例子找到了最上面的部分。這就是我沿着循環路徑走下去的原因。我真的不想在這裏粘貼整個文件,我也沒有看到我可以上傳任何文件的位置? –

+0

好吧,我得到它太工作,使用我原來的代碼和你的建議保存...如果node7.InnerText <>「SchoolFiles」和node7.InnerText <>「DataImportFiles」然後 '需要更改2509到另一個numnber 調試。打印(node7.InnerText) node7.Value =「2509」 myXmlDocument.Save(FileZillaXMLFilterFile) –