【问题标题】:Extracting objects from xml that uses node prefixes using xpath使用 xpath 从使用节点前缀的 xml 中提取对象
【发布时间】:2020-03-02 15:36:47
【问题描述】:

我在一个名为 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。

谢谢大家,

大卫。

【问题讨论】:

    标签: c# xml xpath


    【解决方案1】:

    你可以使用 local-name() 忽略命名空间

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

    【讨论】:

    • 谢谢 :-) - 我会试一试,看看我能不能让它工作.. (我已经尝试过 "/systemConfig/map[@id='folderMappings' ]" 和 "/systemConfig/map[@id='folderMappings']/entry" - 但我 [现在] 会尝试您的建议。
    • @user3354235,可以去掉namespace参数。
    • 谢谢!让它与以下 xpath 一起工作: "/*[local-name()='systemConfig']/*[local-name()='map'][@id='folderMappings']/*[local-name( )='entry']" 这得到了 节点的列表,然后我可以使用以下代码从中提取值:string folderName = xmlNode.Attributes["value"].Value;谢谢大家:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多