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,您是否需要知道。

感谢任何可以帮助我解决这个问题的人,我真的很感激。

4

3 回答 3

2

这可以通过使用LINQ to XML来实现(请参阅XDocument 类)。假设存在具有 value 元素的单个 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(...);
于 2013-02-15T08:49:23.963 回答
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");
于 2013-02-15T08:53:28.157 回答
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");

您可能需要整理一下,就像匹配节点名称不变量大小写或文化,但它应该让你开始。

于 2013-02-15T08:54:11.253 回答