C# XPath表达式必须计算为具有OK XPath路径的节点集(使用在线XPath tester和Oxygen进行测试)

C# XPath表达式必须计算为具有OK XPath路径的节点集(使用在线XPath tester和Oxygen进行测试),c#,xml,xpath,C#,Xml,Xpath,我正在处理的程序在尝试删除节点时出现空引用异常 错误代码: 第一个是声明变量以获取要删除的节点的名称 foreach (XmlNode InstalledListNodes in PackagesNode) { //If the title is the same as what the user typed, continue on if (InstalledListNodes.A

我正在处理的程序在尝试删除节点时出现空引用异常

错误代码:

第一个是声明变量以获取要删除的节点的名称

foreach (XmlNode InstalledListNodes in PackagesNode)
                {

                    //If the title is the same as what the user typed, continue on
                    if (InstalledListNodes.Attributes["title"].Value.Equals(packagename) == true)
                    {
                        uninstallernodename = InstalledListNodes.LocalName;
第二个是它被删除的地方

XmlNode PackagesListForRemoval = InstalledList.SelectSingleNode("/packages/installed/" + uninstallernodename);
                        PackagesListForRemoval.ParentNode.RemoveChild(PackagesListForRemoval);
                        InstalledList.Save("Apps.installed");
XML文件

<?xml version="1.0" encoding="utf-8" ?>
<packages>
  <installed>
  <sampleapp title="sampleapp" id="00001" unintallername="sampleapp.bat" installdate="11/15/09"></sampleapp>
  <sampleapp2 title="sampleapp2" id="00002" uninstallername="sampleapp2.bat" installdate="11/16/09"></sampleapp2>
  </installed>
  <uninstalled>

 </uninstalled>
</packages>
缺少的其他必要零件的代码:

XmlNodeList PackagesNode = InstalledList.SelectNodes(installedpkgxpath + "*");
                string uninstallernodepkgid = null;
                string uninstallernodename = null;
                foreach (XmlNode InstalledListNodes in PackagesNode)
                {

                    //If the title is the same as what the user typed, continue on
                    if (InstalledListNodes.Attributes["title"].Value.Equals(packagename) == true)
                    {
                        uninstallernodename = InstalledListNodes.LocalName;
                        Console.WriteLine(uninstallernodename);
要知道,正如你所知道的,这不是完整的代码,只是需要的部分

此外,程序的完整输出是


tallernodename)

为什么不将xpath更改为:

InstalledList.SelectSingleNode(string.Format("/packages/installed/sampleapp [@title='{0}']", uninstallernodename));
编辑: 如果您不确定节点将是什么类型,则对xpath进行简单更改即可解决此问题:

InstalledList.SelectSingleNode(string.Format("/packages/installed/* [@title='{0}']", uninstallernodename));
这将选择具有中替换的标题的所有子节点,而不考虑类型。如果您遵循这一点,再编写几行简单的代码:

        XmlNode node = doc.SelectSingleNode(xpath);

        XmlNode parent = node.ParentNode;
        parent.RemoveChild(node);
我刚刚使用您提供的xml对此进行了测试,效果很好。如果没有,那么你就做错了别的事情


如果您需要更多关于XML和XPath的帮助,.

您前面的问题非常类似。你为什么要删除它?我想“撞”我的车question@lndebi:请不要那样做。改为编辑你的问题;那会让你大吃一惊的。我已经扩展了我的答案以回应你的编辑。这样做(并替换packagename的值而不是uninstallernodename,您可以摆脱foreach循环-除非您在循环中执行此处未提及的其他操作。我不知道/packages/installed/之后的值是什么,这就是为什么我不能这样做的原因,这就是为什么它需要是一个变量您有一个comm“如果标题与用户键入的标题相同,请继续”。这(对我来说)意味着您正在搜索与用户键入的标题相同的节点,我建议的xpath将为您找到该节点。除非您的注释不准确?或者您是说您不知道该节点是否将被称为“sampleapp”?如果是这种情况,请检查我编辑的帖子。
        XmlNode node = doc.SelectSingleNode(xpath);

        XmlNode parent = node.ParentNode;
        parent.RemoveChild(node);