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"访问其任何子节点。
可以使用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格式是动态的。