c# - 按 XAttribute 的值合并 XDocument
问题描述
我已经设法合并XElement
了具有相同XAttribute
值的 -s ,但我不知道如何找到List<XElement>
不在附加的XDocument
.
<!--xml1-->
<SecurityPrivileges>
<SecurityPrivilege Principal="user1">
<Privilege Type="FileSystem" AccessType="read" Action="Add">c:\log</Privilege>
</SecurityPrivilege>
</SecurityPrivileges>
<!--xml2-->
<SecurityPrivileges>
<SecurityPrivilege Principal="user2">
<Privilege Type="FileSystem" AccessType="read" Action="Add">c:\log</Privilege>
</SecurityPrivilege>
</SecurityPrivileges>
<!--expected result-->
<SecurityPrivileges>
<SecurityPrivilege Principal="user1">
<Privilege Type="FileSystem" AccessType="read" Action="Add">c:\log</Privilege>
</SecurityPrivilege>
<SecurityPrivilege Principal="user2">
<Privilege Type="FileSystem" AccessType="read" Action="Add">c:\log</Privilege>
</SecurityPrivilege>
</SecurityPrivileges>
这是我不完整的方法。我合并主体并检查权限是否已经存在,但我不知道如何将新主体附加到result
.
internal XDocument AppendXml(XDocument original, XDocument append)
{
XDocument result = XDocument.Parse($"<{root}></{root}>");
//Find similar principals
foreach (XElement originalElement in original.Root.Elements())
{
XElement resultElement = originalElement;
string originalPrincipal = originalElement.Attribute(PRINCIPAL).Value;
//Matching principal in the append xml - there can be only one
XElement appendPrincipal = append.Root.Elements().Where(x =>
x.Attribute(PRINCIPAL).Value.Equals(originalPrincipal)).ElementAt(0);
if (!appendPrincipal.IsEmpty)
{
foreach (XElement appendPrivilege in appendPrincipal.Elements())
{
//Check if Privilege appending is necessary
if (!originalElement.Elements()
.Any(oPrivilege => HasPrivilege(oPrivilege, appendPrivilege)))
{
resultElement.Add(appendPrivilege);
}
}
}
result.Root.Add(resultElement);
}
//TODO add new principals to result
List<XElement> appendPrincipals = append.Root.Elements().Where(...);
return result;
}
解决方案
我已经想通了。它不像我想要的那样容易阅读......
foreach (XElement appendElement in append.Root.Elements())
{
string appendPrincipal = appendElement.Attribute(PRINCIPAL).Value;
//If the result does not contain an XElement with this attribute
if (!result.Root.Elements()
.Any(x => x.Attribute(PRINCIPAL).Value.Equals(appendPrincipal)))
{
result.Root.Add(appendElement);
}
}
推荐阅读
- java - 从 Java 服务运行 .exe
- javascript - 在不打开电子邮件客户端的情况下从 RN Expo 应用发送静默电子邮件
- python - 如何使用 OR 语句比较整数(python)
- node.js - 为什么 npm 无法启动?
- sql - PostgreSQL为另一个表的所有行创建外键
- azure - 所有通过 Sendgrid 阻止的电子邮件,如何再次发送电子邮件?
- mysql - 如何进行具有多个关系的查询?
- django - 我如何从 3 个表 django 中获取数据 manytomay 关系
- python - 我正在编写一个带有 if 语句的 for 循环,但它什么也不返回?
- nessus - Nessus 如何在扫描中检测 CVE