这是我的名为device.xml的Xml文档:
<?xml version="1.0" encoding="ISO-8859-1"?>
<Device DeviceInfo="443">
<Settings>
<Section Name="CustomData">
<Entry Name="InstitutionName" Value=""></Entry>
<Entry Name="DeviceSerialNumber" Value=""></Entry>
</Section>
<Section Name="ExternalTools">
<Entry Name="Printers and Faxes" ShellPath="control printers" Service="True"></Entry>
<Entry Name="Task Manager" ShellPath="taskmgr" Service="True"></Entry>
<Entry Name="Control Panel" ShellPath="control" Service="True"></Entry>
<Entry Name="Notepad" ShellPath="notepad" Service="True"></Entry>
<Entry Name="Paint" ShellPath="mspaint" Service="True"></Entry>
<Entry Name="Command Prompt" ShellPath="cmd" Service="True"></Entry>
<Entry Name="Google Search" ShellPath=""%ProgramFiles%\Internet Explorer\iexplore.exe" http://www.google.com" Service="True"></Entry>
</Section>
<Section Name="ResearchTools"></Section>
</Settings>
</Device>
我正在尝试删除打印机和传真部分,以及稍后的命令提示符。我无法弄清楚选择单个节点的语法。这就是我所拥有的:
using System;
using System.Xml;
namespace ExternalToolsUpdateScript
{
class Program
{
static void Main(string[] args)
{
string xmlPath = "D:\\Device\\device.xml";
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(xmlPath);
XmlNode node = xmlDocument.SelectSingleNode("Settings/Section[Entry = 'Printers and Faxes']");
node?.ParentNode?.RemoveChild(node);
xmlDocument.Save(xmlPath);
}
}
}
我可以让它删除大多数条目名称的所有内容,或者只删除那个单一的输入行。我做错了什么?请注意,我还是一名初中学生。
答案 0 :(得分:1)
最简单的方法是使用Linq to Xml来执行此操作:
var xml = XDocument.Load("D:\\Device\\device.xml");
xml.XPathSelectElement("Device/Settings/Section/Entry[@Name = 'Printers and Faxes']")
?.Remove();
您可以使用XPathSelectElement
或XPathSelectElements
,具体取决于您是要分别查找和删除单个节点还是删除多个节点。
请注意,您的原始XPath查询缺少根元素,并且元素选择器语法错误。我在上面的版本中更正了这些问题。
您需要确保引用System.Xml.Linq
程序集,并且您需要导入System.Xml.Linq
和System.Xml.XPath
名称空间。