【问题标题】:Merge XDocuments by XAttribute's value按 XAttribute 的值合并 XD​​ocument
【发布时间】: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 不幸的是没有。这是一个不同的步骤,处于不同的阶段。

标签: c# xml linq


【解决方案1】:

我想通了。它不像我想象的那么容易阅读......

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);
    }
}

【讨论】:

    猜你喜欢
    • 2011-08-28
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    相关资源
    最近更新 更多