为什么这个xPath(c#)不起作用?
获取以下xml:为什么这个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 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;