在xml文件中选择特定节点

时间:2018-01-16 17:07:39

标签: c# .net xml

这是我的名为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="&quot;%ProgramFiles%\Internet Explorer\iexplore.exe&quot; 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);
        }
    }
}

我可以让它删除大多数条目名称的所有内容,或者只删除那个单一的输入行。我做错了什么?请注意,我还是一名初中学生。

1 个答案:

答案 0 :(得分:1)

最简单的方法是使用Linq to Xml来执行此操作:

var xml = XDocument.Load("D:\\Device\\device.xml");

xml.XPathSelectElement("Device/Settings/Section/Entry[@Name = 'Printers and Faxes']")
  ?.Remove();

您可以使用XPathSelectElementXPathSelectElements,具体取决于您是要分别查找和删除单个节点还是删除多个节点。

请注意,您的原始XPath查询缺少根元素,并且元素选择器语法错误。我在上面的版本中更正了这些问题。

您需要确保引用System.Xml.Linq程序集,并且您需要导入System.Xml.LinqSystem.Xml.XPath名称空间。