xmlnode如何查看节点是不是存在

Posted

技术标签:

【中文标题】xmlnode如何查看节点是不是存在【英文标题】:Xmlnode how to see if the node exist or notxmlnode如何查看节点是否存在 【发布时间】:2014-06-12 08:58:14 【问题描述】:

我需要一些帮助来检查节点是否存在。

我可以像这样选择节点

node["sa:name1"]["sa:name2"]["sa:name3"]

这工作正常,但如果节点不存在我得到一个错误我已经尝试过这个

if(node.SelectSingleNode("/sa:name1/sa:name2/sa:name3") != null)

但这确实有助于这只会产生一个新错误

System.Xml.dll 中出现“System.Xml.XPath.XPathException”类型的异常,但未在用户代码中处理

其他信息:需要命名空间管理器或 XsltContext。此查询具有前缀、变量或用户定义的函数。

【问题讨论】:

【参考方案1】:

使用http://msdn.microsoft.com/en-us/library/system.xml.xmlnamespacemanager.addnamespace.aspx

XmlNamespaceManager nsMgr = new XmlNamespaceManager(node.OwnerDocument.NameTable);

nsMgr.AddNamespace("sa", "http://example.com/");

XmlNode selected = node.SelectSingleNode("/sa:name1/sa:name2/sa:name3", nsMgr);
if (selected != null)

  ...

你当然需要使用输入文档中节点的URI而不是http://example.com/,我认为命名空间URI是http://rep.oio.dk/uvm.dk/studieadm/common/xml/schemas/2006/02/20/

【讨论】:

你好 Martin 我很确定我必须使用这个 URI 'rep.oio.dk/uvm.dk/studieadm/common/xml/schemas/2006/02/20/…' 但是现在当我尝试选择单节点时我总是得到 null ? 试试http://rep.oio.dk/uvm.dk/studieadm/common/xml/schemas/2006/02/20/,不带文件名。 感谢您的帮助,但我刚刚尝试了这个,这改变了任何东西仍然只有空。 请编辑您的问题并提供一个 XML 输入示例,显示其中声明的命名空间。 找到这篇文章***.com/questions/6950032/… 我需要在我的 xpath 前面添加 './' 才能从当前节点中进行选择。但感谢剩下的这对我有很大帮助。【参考方案2】:

错误很明显:您需要在代码中添加名称空间管理器,才能使 xpath 查询正常工作。使用 SelectSingleNode() 的重载版本,它接受 XmlNamespaceManager 的实例作为参数。

  XmlDocument doc = new XmlDocument();
  doc.Load("booksort.xml");

  //Create an XmlNamespaceManager for resolving namespaces.
  XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
  nsmgr.AddNamespace("bk", "urn:samples");

  //Select the book node with the matching attribute value.
  XmlNode book;
  XmlElement root = doc.DocumentElement;
  book = root.SelectSingleNode("descendant::book[@bk:ISBN='1-861001-57-6']", nsmgr);

  Console.WriteLine(book.OuterXml);

http://msdn.microsoft.com/en-us/library/h0hw012b(v=vs.110).aspx

【讨论】:

【参考方案3】:

在调用SelectSingleNode之前,您需要为文档添加一个命名空间管理器:

XmlNamespaceManager xmlnsMan = new XmlNamespaceManager(xml.NameTable);
xmlnsMan.AddNamespace("sa", "[namespace]);

【讨论】:

以上是关于xmlnode如何查看节点是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

如何删除 XmlElement ? (XmlNode 与 XmlElement)

如何在 Windows Phone 中检查 XMLNode 是不是存在

如何检查 XmlAttributeCollection 中是不是存在属性?

C#如何在xmlnode中存储网站列表

XMLNODE:如何在我的 xml 中选择具有属性的此节点

如何序列化 XMLNode 类型的属性