SelectSingleNode的XPath问题?

时间:2013-05-31 20:38:14

标签: c# xml xpath

我正在尝试使用SelectSingleNode从C#中的XML字符串中获取节点。 XML字符串来自外部源。

string logonXML = @"<attrs xmlns=""http://www.sap.com/rws/bip\"">
                        <attr name=""userName"" type=""string""></attr>
                        <attr name=""password"" type=""string""></attr>
                        <attr name=""auth"" type=""string"" possibilities=""secEnterprise,secLDAP,secWinAD,secSAPR3"">secEnterprise</attr>
                    </attrs>";

XmlDocument doc = new XmlDocument();
doc.LoadXml(logonXML);
XmlNode root = doc.DocumentElement;

XmlNode usernameXML = root.SelectSingleNode("//attr[@name='userName']");
Debug.WriteLine(usernameXML.OuterXml);

然而,usernameXML是null。我尝试使用docroot两种XPath查询,但似乎找不到节点。这个XPath有什么问题?或者我使用图书馆错了?

1 个答案:

答案 0 :(得分:2)

您需要考虑在根节点上定义的 XML命名空间

尝试这样的事情:

string logonXML = @"<attrs xmlns=""http://www.sap.com/rws/bip"">
                        <attr name=""userName"" type=""string""></attr>
                        <attr name=""password"" type=""string""></attr>
                        <attr name=""auth"" type=""string"" possibilities=""secEnterprise,secLDAP,secWinAD,secSAPR3"">secEnterprise</attr>
                    </attrs>";

XmlDocument doc = new XmlDocument();
doc.LoadXml(logonXML);

// define the XML namespace(s) that's in play here
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("ns", "http://www.sap.com/rws/bip");

// select including the XML namespace manager
XmlNode usernameXML = doc.SelectSingleNode("/ns:attrs/ns:attr[@name='userName']", nsmgr);

string test = usernameXML.InnerText;