大家好! 我有一个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,如果您需要知道。
感谢任何可以帮助我的人,我真的很感激。
答案 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");
你可能需要整理一下,比如匹配案例或文化的节点名称不变量,但它应该让你开始。