如何解析使用NamspaceManager在C#XML,XML是具有元素定义的命名空间平

问题描述:

我希望解析以下XML如何解析使用NamspaceManager在C#XML,XML是具有元素定义的命名空间平

写入
<?xml version="1.0" encoding="UTF-8"?> 
<product xmlns="http://products.org"> 
    <make xmlns="http://camera.org"> 
<model>Camry</model> 
</make> 
<make xmlns="http://tv.org"> 
    <model>Sony</model> 
</make> 
</product> 

代码解析它

这是如何即时写入解析代码

enter image description here 但在最后im得到null inxmlNode对象。你能告诉还有什么可以做的吗?

+0

请提供pXMLElementPath, – harpo

+0

的价值它是反刍/产品或/ make或 – Abhi

+0

如果你是包括“/”,那么这就是问题所在。节点的名称是“产品”或“制造”。 –

您不能忽略XPath中的命名空间。*文档中的元素都具有非空白的命名空间URI。

您的问题标题显示您的方向正确:您需要使用XmlNamespaceManager将URI的前缀显式绑定到前缀,并在路径表达式中使用这些前缀。

这个程序对你的输入文档

using System; 
using System.Xml; 

public class XPathNamespace 
{ 
    public static void Main() { 

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

     XmlNamespaceManager xnm = new XmlNamespaceManager(doc.NameTable); 
     xnm.AddNamespace("p", "http://products.org"); 
     xnm.AddNamespace("c", "http://camera.org"); 
     xnm.AddNamespace("t", "http://tv.org"); 

     ShowNode(doc.SelectSingleNode("/p:product", xnm)); 
     ShowNode(doc.SelectSingleNode("/p:product/c:make", xnm)); 
     ShowNode(doc.SelectSingleNode("/p:product/t:make", xnm)); 
    } 

    private static void ShowNode(XmlNode node) { 
     Console.WriteLine("<{0}> {1}", 
          node.LocalName, 
          node.NamespaceURI); 
    } 
} 

测试,它产生以下输出

<product> http://products.org 
<make> http://camera.org 
<make> http://tv.org 

希望这有助于。

(*)这并不意味着您不能忽略XPath中的确切命名空间。例如,您可以匹配

/*[local-name()='product'] 

但是,这是一个解决办法,并说明你仍然不得不面对一个命名空间的存在在某种程度上或其他。

+0

非常好的harpo,我用类似的方法做这件事。我可以在运行时添加命名空间,因为我有他们在一个字典对象。但是在运行时,我怎么才能知道,在我的xpath表达式之前,我是否需要前缀p:,或者c:或t: – Abhi

+0

前缀是任意的。它只需要匹配表达式中使用的前缀。这听起来像你可以连续创建前缀(如'ns1','ns2'等)。您必须构建XPath表达式才能使用相应的前缀。 – harpo

+0

harpo我已更新代码屏幕快照 – Abhi

这是你最好的例子。请看一看。

http://www.codeproject.com/KB/cpp/myXPath.aspx