[英]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);
只需知道,正如您所知道的,不是完整的代码,而是所需的部分
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.