使用xpath从使用节点前缀的xml中提取对象

时间:2019-11-06 07:45:09

标签: c# xml xpath

我在名为C:\ temp \ config.xml的文件中具有以下XML:

<?xml version="1.0" encoding="utf-8"?>
<dvp:systemConfig xmlns:devop="urn:foo.com:sys:rules">
    <dvp:map id="rootFolderMap">
        <dvp:entry key="anything" value="folder1"/>
        <dvp:entry key="config" value="folder2"/>
        <dvp:defaultValue value="folder1" />
    </dvp:map>
    <dvp:map id="folderMappings">
        <dvp:entry key="SYS" value="System" />
        <dvp:entry key="OPS" value="Operations" />
        <dvp:entry key="DEV" value="Development" />
        <dvp:defaultValue value="Miscellaneous" />
    </dvp:map>

</dvp:systemConfig>

我现在正在尝试编写将从该XML中提取值的C#代码。特别是节点中的值属性列表。

List<string> folderNames = new List<string>
XmlDocument doc = new XmlDocument();
doc.Load(@"C:\temp\config.xml");
XmlNamespaceManager nsMgr = new XmlNamespaceManager(doc.NameTable);

XmlNodeList xmlNodeList =
    doc.SelectNodes("/systemConfig/map[@id='folderMappings']/entry",nsMgr);
foreach (XmlNode xmlNode in xmlNodeList)
{        
    // I'm hoping xmlNodeList now contains a list of <dvp:entry> nodes.
    string folderName = xmlNode.Attributes["value"].ToString().Trim(); 
    folderNames.Add(folderName);
}

但是,此代码返回一个空的xmlNodeList,因此最终循环中没有任何项目。

我不确定如何使用XmlNamespaceManager来获取“ dvp”前缀,或者当它从磁盘上的XML加载XmlDocument时是否能弄清楚这一点。

谁能给我一些指导,说明如何使用xpath检索带有前缀节点的xml的值?不幸的是,我无权更改XML格式,因此必须使用提供的xml。

感谢堆,

大卫。

1 个答案:

答案 0 :(得分:0)

您可以使用local-name()忽略名称空间

XmlNodeList xmlNodeList =
    doc.SelectNodes("/*[local-name()='systemConfig']/*[local-name()='map'][@id='folderMappings']");