首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按XAttribute的值合并XDocuments

按XAttribute的值合并XDocuments
EN

Stack Overflow用户
提问于 2018-04-26 13:48:28
回答 1查看 62关注 0票数 0

我已经设法合并了具有相同XAttribute值的XElement-s,但我不知道如何找到不在附加的XDocument中的List<XElement>

代码语言:javascript
复制
<!--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

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2018-04-26 14:10:25

我已经弄明白了。它并不像我想的那样容易阅读……

代码语言:javascript
复制
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);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50035652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档