gpt4 book ai didi

c# - 在 LINQ 中将 2 个 xml 合并为一个新 XML 的有效方法

转载 作者:行者123 更新时间:2023-11-30 22:35:39 25 4
gpt4 key购买 nike

我有用于管理网站权限的每个用户的 XML,还有一个管理工具可以更新 XML 以授予/拒绝/修改对新用户或现有用户的访问权限

XML 的结构看起来像

<Security>
<FiscalYear ID="2011">
<Country ID="23">
<State ID="10">
<City ID="1"></City>
<City ID="3"></City>
</State>
</Country>
</FiscalYear>
<FiscalYear ID="2010">
<Country ID="13">
<State ID="20">
<City ID="11"></City>
<City ID="32"></City>
</State>
</Country>
</FiscalYear>
</Security>

现在如果管理员想要授予新的 2012 财政年度的权限,我将得到这样的输入

<FiscalYear ID="2012">
<Country ID="13">
<State ID="20">
<City ID="11"></City>
<City ID="32"></City>
</State>
</Country>
</FiscalYear>

因此,这个节点将作为新节点附加到现有节点或者如果他想修改现有的权限

<FiscalYear ID="2011">
<Country ID="13">
<State ID="20">
<City ID="11"></City>
<City ID="32"></City>
</State>
</Country>
</FiscalYear>

这个是用来修改权限的,意思是给用户访问state 20和cities 11和32

有什么最好的方法或例子可以满足我合并数据的要求

最佳答案

如果你只是想追加一个新节点,这很简单:

var xmlDocument = XDocument.Parse(xmlParentStr);
var xmlToAdd = XElement.Parse(xmlToAddStr);

if (null != xmlDocument.Element("Security"))
xmlDocument.Element("Security").AddFirst(xmlToAdd);

其中 xmlParentStr 是一个字符串,其中包含您首先呈现的 xml,带有 2011 和 2010 财政年度标记。 xmlToAdd 是带有 2012 财年 xml 的字符串。这将为您提供:

<Security>
<FiscalYear ID="2012">
<Country ID="13">
<State ID="20">
<City ID="11"></City>
<City ID="32"></City>
</State>
</Country>
</FiscalYear>
<FiscalYear ID="2011">
<Country ID="23">
<State ID="10">
<City ID="1"></City>
<City ID="3"></City>
</State>
</Country>
</FiscalYear>
<FiscalYear ID="2010">
<Country ID="13">
<State ID="20">
<City ID="11"></City>
<City ID="32"></City>
</State>
</Country>
</FiscalYear>
</Security>

顺便说一句,还有多种其他方法可以将 xml 加载到 XDocument 或 XElement 中。例如 XDocument.Load() 和 XElement.Load,它们可以从 FileStream、URI 或 Reader 中提取它。

如果您随后想更改 2011 年的国家/地区 ID,您可以通过以下方式轻松完成:

var elementToChange=xmlDocument
.Descendants()
.Where(x => x.Name.LocalName=="FiscalYear" && x.Attribute("ID")!=null && x.Attribute("ID").Value=="2011");

foreach(var element in elementToChange) {
var changes = element.Descendants().Where(x => x.Name.LocalName == "Country" && x.Attribute("ID").Value == "23");
foreach(var change in changes) {
change.Attribute("ID").SetValue("1337");
}
}

然后会产生:

<Security>
<FiscalYear ID="2012">
<Country ID="13">
<State ID="20">
<City ID="11"></City>
<City ID="32"></City>
</State>
</Country>
</FiscalYear>
<FiscalYear ID="2011">
<Country ID="1337">
<State ID="10">
<City ID="1"></City>
<City ID="3"></City>
</State>
</Country>
</FiscalYear>
<FiscalYear ID="2010">
<Country ID="13">
<State ID="20">
<City ID="11"></City>
<City ID="32"></City>
</State>
</Country>
</FiscalYear>
</Security>

我把你需要的值改成了“1337”,因为这样比较容易看,但是原理是一样的。您可以继续以这种方式沿着树走下去。 (下面的代码将更改匹配的每个条目,如果您决定只更改第一个或知道您只会有一个,您可以简化上面的代码并使用 .FirstOrDefault() 摆脱 foreach 循环)

关于c# - 在 LINQ 中将 2 个 xml 合并为一个新 XML 的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7388088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com