我用C#中的XmlDocument读取XML格式的文件,一个是报表文件(.rdl),另一个是Nhibernate映射文件(Mapping.hbm.xml),但是SelectNodes,SelectSingleNode总是返回NULL,纠结半天,原因是这两个xml文件中声明有自己的命名空间。
以Nhibernate映射文件为例:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="****" namespace="****">
<class name="CommonEntity" table="common.Entity"></class>
</hibernate-mapping>
其中的命名空间为:urn:nhibernate-mapping-2.2,要想读取到class节点,需要通过以下方式
XmlDocument xml = new XmlDocument();
xml.Load(path);
XmlNamespaceManager nsMgr = new XmlNamespaceManager(xml.NameTable);
nsMgr.AddNamespace("ns", "urn:nhibernate-mapping-2.2");
XmlNodeList classes = xml.SelectNodes("//ns:class", nsMgr);
XmlNode singleClass = xml.SelectSingleNode("/ns:hibernate-mapping/ns:class", nsMgr);
解决方案出自于强大的stackoverflow
http://stackoverflow.com/questions/1766254/selectsinglenode-always-returns-null