繁体   English   中英

XPath Expression必须使用OK XPath Path评估为节点集(已通过在线XPath测试仪和Oxygen测试)

[英]XPath Expression must evaluate to a node-set with OK XPath Path (Tested with online XPath tester and Oxygen)

每当我尝试删除该节点时,我正在处理的程序都会具有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;

第二个是删除它的地方

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>

我已经检查了变量名,它正确地打印出了“ sampleapp”,并且我的XPath是正确的。

编辑:

它仍然处于无法正常工作的状态,但是我得到它没有空引用错误,但是现在它有一个XPath错误,我无法完全理解,因为变量很好,并且可以很好地打印出来,并且路径也很好因为我使用多个XPath测试器实用程序对其进行了测试

并没有太大的区别,但是删除节点的代码稍有更改

try
                    {
                        Console.WriteLine(uninstallernodename);
                        string packagepath = "/packages/installed/";
                        XmlNode PackagesListForRemoval = InstalledList.SelectSingleNode(packagepath + nodename2bdeleted);
                        PackagesListForRemoval.ParentNode.RemoveChild(PackagesListForRemoval);
                        InstalledList.Save("Apps.installed");
                    }
                    catch (Exception Failed2DelNode)
                    {
                        Console.WriteLine("Cleanup failure, please ignore the message below unless you are a software developer, the problem should not affect you but you may always go online for support");
                        Console.WriteLine(Failed2DelNode);
                        ErrorDumpWriter.WriteLine(" ");
                        ErrorDumpWriter.WriteLine(DateTime.Now);
                        ErrorDumpWriter.WriteLine(Failed2DelNode);
                    }

其他缺少的必要部分的代码:

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);

只需知道,正如您所知道的,不是完整的代码,而是所需的部分

程序的完整输出也是 http://i48.tinypic.com/dwtlxd.png

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的更多帮助, 请检查此链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM