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 クラスを参照)。値を持つ要素を持つ単一 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 に答える