2013-02-15 204 views
0

大家好! 我有一個XML文件,需要更改節點的值,特別是指定的行。我的問題是,正如你所看到的,有很多節點。更改具有相同名稱的XML節點?

我該如何改變這條線?這個XML文件可能會大得多,所以我正在尋找一個解決方案,將不同數量的'launch.file'節點考慮在內。

需要設置爲True的節點將由相應的NAME標籤標識。所以如果我輸入ULTII,那個塊的DISABLED節點將被設置爲True。如果我輸入Catl,則該塊的DISABLED節點將被更改。

<?xml version="1.0" encoding="windows-1252"?> 
<SBase.Doc Type="Launch" version="1,0"> 
    <Descr>Launch</Descr> 
    <Filename>run.xml</Filename> 
    <Disabled>False</Disabled> 
    <Launch.ManualLoad>False</Launch.ManualLoad> 
    <Launch.File> 
    <Name>Catl</Name> 
    <Disabled>False</Disabled> 
    <ManualLoad>False</ManualLoad> 
    <Path>ft\catl\catl.exe</Path> 
    </Launch.File> 
    <Launch.File> 
    <Disabled>False</Disabled>   <!-- change to True --> 
    <ManualLoad>False</ManualLoad> 
    <Name>ULTII</Name> 
    <Path>F:\ULTII.exe</Path> 
    <NewConsole>True</NewConsole> 
    </Launch.File> 
    <Launch.File> 
    <Name>ECA</Name> 
    <Disabled>False</Disabled> 
    <Path>C:\ECA.exe</Path> 
    </Launch.File> 
</SBase.Doc> 

我正在使用Visual Studio 2012,如果您需要了解。

謝謝任何​​能夠幫助我的人,我真的很感激。

+1

我會使Name元素成爲一個屬性,並根據該關鍵字搜索記錄。 – 2013-02-15 08:29:13

+3

那麼這個特定元素的特殊含義是否意味着你要設置*那個被禁用而不是前一個? Launch.File元素的哪個方面是相關的? – 2013-02-15 08:29:54

+0

感謝您的幫助。基本上,需要設置爲True的節點將由相應的NAME標籤標識。所以如果我輸入ULTII,那個塊的DISABLED節點將被設置爲True。如果我輸入Catl,則該塊的DISABLED節點將被更改。 – user2074700 2013-02-15 08:36:39

回答

2

這可以通過使用LINQ to XML(參見XDocument Class)來實現。 假設存在Launch.File元素與Name元素與價值"ULTII"

var document = XDocument.Load(...); 

var ultiiElement = document 
    .Descendants("Launch.File") 
    .Single(fileElement => fileElement.Element("Name").Value == "ULTII"); 
ultiiElement.Element("Disabled").Value = "True"; // or true.ToString() 

document.Save(...); 
+0

NAME元素將始終是唯一的,但需要禁用標籤更改的名稱將在運行時確定,因此我無法真正對其進行硬編碼。我很新的XML,所以我會去。謝謝! – user2074700 2013-02-15 08:51:35

+0

@ user2074700,好吧,如果它適合你,請考慮接受答案。 – 2013-02-15 18:55:37

2

繼承人我的方法去做你想做

private void DisableLaunchFile(string xmlfile, string launchFileName){ 
    XDocument doc = XDocument.Load(xmlfile); 

    var launchFileElement = doc.Descendants("Launch.File").Where (d => d.Element("Name").Value == lauchFileName); 

    launchFileElement.Elements("Disabled").First().Value = true.ToString(); 

    doc.Save(xmlfile); 
} 

使用它像什麼:

string pathToXmlFile = //assign ; 

DisableLaunchFile(pathToXmlFile, "Catl"); 

DisableLaunchFile(pathToXmlFile, "ULTII"); 
+0

很好,謝謝! – user2074700 2013-02-15 19:14:46

0

這種方法將訣竅:

public void ChangeNode(string name, string filePath) 
{ 

    XDocument xDocument; 
    using (var streamReader = new StreamReader(filePath)) 
    { 
     xDocument = XDocument.Parse(streamReader.ReadToEnd()); 
    } 

    var nodes = xDocument.Descendants("Launch.File"); 

    foreach (var node in nodes) 
    { 
     var nameNode = node.Descendants("Name").FirstOrDefault(); 

     if (nameNode != null && nameNode.Value == name) 
     { 
      var disabledNode = node.Descendants("Disabled").FirstOrDefault(); 

      if (disabledNode != null) 
      { 
       disabledNode.SetValue("True"); 
      } 
     } 
    } 

    using (var streamWriter = new StreamWriter(filePath)) 
    { 
     xDocument.Save(streamWriter);    
    } 
} 

要傳入的名稱是要更改的節點的名稱,路徑是xml文件的文件路徑。所以,你可以這樣調用它:

ChangeNode("ULTII", "C:\\output.xml"); 

您可能需要整理這件事有點像匹配的情況下,或文化的節點名稱不變,但它應該讓你開始。

相關問題