更改具有相同名称的XML节点?

时间:2013-02-15 08:26:06

标签: c# xml c#-4.0

大家好! 我有一个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,如果您需要知道。

感谢任何可以帮助我的人,我真的很感激。

3 个答案:

答案 0 :(得分: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(...);

答案 1 :(得分: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");

答案 2 :(得分: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");

你可能需要整理一下,比如匹配案例或文化的节点名称不变量,但它应该让你开始。