对于带有命名空间的XML,XPATH返回null

时间:2012-07-27 05:54:40

标签: c# asp.net xml xpath

我有以下XML。

<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://localhost/gsainis/GsaInisWebService">
    <string>
        <gsafeed>
            <group action="add">
                <record>
                 ......
                 ......
                </record>
            </group>
        </gsafeed>
   </string>
</ArrayOfString>

我正在使用C#代码(.NET 4.0)来解析此XML。我使用下面的代码选择上述XML中的所有<record>节点。

XmlNamespaceManager xmlnsmgr = new XmlNamespaceManager(INISRecordXMLdoc.NameTable);
xmlnsmgr.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
xmlnsmgr.AddNamespace("xsd", "http://www.w3.org/2001/XMLSchema");
xmlnsmgr.AddNamespace(string.Empty, "http://localhost/gsainis/GsaInisWebService");

foreach (XmlNode node in INISRecordXMLdoc.SelectNodes("//ArrayOfString/string/gsafeed/group/record",xmlnsmgr))
{
    //Do something
}

问题是foreach循环从未执行过。应该使用什么正确的XPath,以便获得所有<record>个节点?

1 个答案:

答案 0 :(得分:6)

试试这个 - 过去我遇到过“空”XML前缀的问题:

XmlNamespaceManager xmlnsmgr = new XmlNamespaceManager(INISRecordXMLdoc.NameTable);
xmlnsmgr.AddNamespace("ns", "http://localhost/gsainis/GsaInisWebService");

foreach (XmlNode node in INISRecordXMLdoc.SelectNodes("//ns:ArrayOfString/ns:string/ns:gsafeed/ns:group/ns:record", xmlnsmgr))
{
   // Do something
}

使用空字符串以外的其他内容 - 并在XPath中使用该XML名称空间前缀。