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