Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这个xPath(c#)不起作用?_C#_Xml_Xpath - Fatal编程技术网

为什么这个xPath(c#)不起作用?

为什么这个xPath(c#)不起作用?,c#,xml,xpath,C#,Xml,Xpath,获取以下xml: <?xml version="1.0" encoding="UTF-8"?> <video xmlns="UploadXSD"> <title> A vid with Pete </title> <description> Petes vid </description> <contributor> Pete </contributor>

获取以下xml:

<?xml version="1.0" encoding="UTF-8"?>
<video xmlns="UploadXSD">
  <title>
    A vid with Pete
  </title>
  <description>
  Petes vid
  </description>
  <contributor>
    Pete
  </contributor>
  <subject>
    Cat 2
  </subject>
</video>

我得到一个“对象引用未设置为对象的实例”。从我所看到的和它曾经工作过的情况来看,任何关于这是一个有效xpath的想法…

/video/title
都会从一个没有名称空间的
video
元素中返回一个没有名称空间的
title
元素


您需要从xml中删除
xmlns=“UploadXSD”
,或者在C#

中设置适当的选择名称空间
doc
变量是否可能指向
元素?在这种情况下,您需要编写

videoToAdd.Title = doc.SelectSingleNode(@"./title").InnerXml;

试试这个:

videoToAdd.Title = doc.SelectSingleNode(@"//xmlns:video/xmlns:title").InnerXml;

您的XML文档有一个XML名称空间,要查找元素,必须在元素前面加上前缀
xmlns:

,这是
xmlns=“UploadXSD”
属性造成的。我认为您需要使用
XmlNamespaceManager
来帮助解析器解析名称,或者删除
xmlns
属性(如果您不需要)。

您的XML包含名称空间规范,您需要修改源代码以将其考虑在内。
示例:

XmlDocument doc = new XmlDocument();
doc.Load("doc.xml");
XmlNamespaceManager xmlnsManager = new XmlNamespaceManager(doc.NameTable);
xmlnsManager.AddNamespace("ns", "UploadXSD");

videoToAdd.Title = doc.SelectSingleNode(@"/ns:video/ns:title", xmlnsManager).InnerXml;

可以显示文档初始化语句吗?
videoToAdd
doc
也可以根据该错误设置为
null
。是否验证了xpath是问题所在?请使用调试器检测videoToAdd或doc是否为null。否,这将找到具有命名空间前缀的元素(根据上下文-不存在该前缀)xmlns,该前缀不是允许的前缀。当您尝试获取InnerXMLCorrect答案时,上述操作将从SelectSingleNode返回null,然后返回NullReferenceException,但如果出现错误,则应为
SelectSingleNode(@)/ns:video/ns:title,xmlnsManager)
,因为title元素也具有相同的命名空间,当您需要将管理器传递给SelectSingleNode以使用它时。
videoToAdd.Title = doc.SelectSingleNode(@"//xmlns:video/xmlns:title").InnerXml;
XmlDocument doc = new XmlDocument();
doc.Load("doc.xml");
XmlNamespaceManager xmlnsManager = new XmlNamespaceManager(doc.NameTable);
xmlnsManager.AddNamespace("ns", "UploadXSD");

videoToAdd.Title = doc.SelectSingleNode(@"/ns:video/ns:title", xmlnsManager).InnerXml;