C#通过引用任何给定的XML节点的父节点来访问该节点的最佳方法是什么

本文关键字:节点 访问 父节点 是什么 方法 最佳 XML 引用 任何 | 更新日期: 2023-09-27 18:02:10

  • (回答-如果这个问题与如何在C#中将XML反序列化为对象重复(

我的问题远比具体的问题抽象得多,我没有要求具体的实现,我想听听找到最佳实践的方法,这些方法应该与任何在处理XML配置文件时寻求最佳C#代码设计的C#开发人员相关

在JavaScript中,您可以指向JSON父节点&保存它的引用。该引用仅包含1个子体级别,并且这些子体对其子体具有相同的引用。

示例:

Config.Json(文件名(

"parentNode" : {
    "descendant_1" :{
        "content_1" : "abcde",
        "content_2" : "abcdef"
     },
     "descendant_2" :{
        "content_1" : "abcdefg",
        "content_1" : "abcdefgh"
     }
}

现在,在JavaScript中,我可以创建对config.json的引用,再加上我想要的任何节点:

var data = Config.get('parentNode.descendant_2');

实现:

Config.prototype.get = function get (key, defaultVal) {
    try {
        return JSON.parse(JSON.stringify(config.get(key)));
    }catch (err) {
        //return default value if one exists
        if (typeof defaultVal !== 'undefined') return defaultVal;   //replaces if(defaultVal) with if (arguments.length > 1) to avoid mistaking default value = false as null
        //nothing to do, crash
        throw err;
    }
};

现在,我可以将参数传递给任何我想要的配置引用的函数,在任何函数中,我都可以继续挖掘嵌套节点,以到达我想要的任何节点。。。

data.content_1将给我abcdefg

data.content_2将给我abcdefgh

我的问题是,在C#中使用XML实现这种能力的最有效方法是什么?

(使用XML和强类型语言不是我的选择,我不会发号施令,所以请避免这些无关的评论,提前感谢(

XML文件:

 <role name="parentNode">
    <descendant name="descendant_1">
        <content_1 name="abcde"></content_1>
        <content_2 name="abcdef"></content_2>
    </descendant >
    <descendant name="descendant_2">
        <content_1 name="abcdefg"></content_3>
        <content_2 name="abcdefgh"></content_4>
    </descendant >
    </role>

在C#中,我可以调用下面的parentNode:

  • 使用XDocument 将Linq转换为XML

  • XPath

我的目标是找到一种方法,使我尽可能接近JavaScript流畅的api代码编写。

这意味着创建一个对父节点的引用,并通过"fluent api"访问其任何子节点。

C#通过引用任何给定的XML节点的父节点来访问该节点的最佳方法是什么

可以使用Linq来Xml+XPathSelectElements扩展方法:(添加using System.Xml.XPath;(

var items = XDocument.Load("data.xml")
                     .XPathSelectElements("/role[@name='parentNode']/*[@name='descendant_2']/*");

您也可以只使用linq到xml:

var items = XDocument.Load("data.xml")
                     .Descendants("descendant")
                     .Where(element => element.Attribute("name").Value == "descendant_2")
                     .Descendants();

如果您的XML配置具有静态格式,您应该研究XML序列化,这将允许您将XML转换为C#对象。

您也可以使用dynamic,但我不建议使用它,除非您的xml格式是动态的。