【发布时间】:2018-04-26 05:48:27
【问题描述】:
我已经设法合并具有相同XAttribute 值的XElement-s,但我不知道如何找到不在附加XDocument 中的List<XElement>。
<!--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;
}
【问题讨论】:
-
建议将xml转成字典,合并字典中的数据,再转回xml作为输出。
-
@qxg 我更愿意将其保留为 XDocument。我在此过程中早些时候进行了字典转换,我不想再次转换它。
-
当它们仍然是字典时是否可以合并它们。
-
@qxg 不幸的是没有。这是一个不同的步骤,处于不同的阶段。