繁体   English   中英

如何根据子级属性过滤XDocument并保持父级结构?

[英]How to filter XDocument based on children attributes and keeping parent structure?

xml树需要根据属性进行过滤。 子元素与父元素具有相同的名称。 如果满足显示元素的条件,则需要显示该元素和所有父结构。

例如,xml看起来像(深度级别是随机的):

<Root>
    <Foo attr="xyz 123"></Foo>
    <Foo attr="abc 111"></Foo>
    <Foo attr="abc 222">
        <Foo attr="abc 111"></Foo>
        <Foo attr="abc 222">
            <Foo attr="xyz 123"></Foo>
        </Foo>
    </Foo>
</Root>

过滤条件是,属性“ attr”包含文本“ xyz”。 过滤后的xml应该如下所示:

<Root>
    <Foo attr="xyz 123"></Foo>
    <Foo attr="abc 222">
        <Foo attr="abc 222">
            <Foo attr="xyz 123"></Foo>
        </Foo>
    </Foo>
</Root>

XDocument用于保存树结构(后来的XDocument_instance.Elements()连接到WPF树视图)。

以下Linq命令仅对第一个元素级别(在Root之后)进行排序:

var Elements = from el in xdoc.Root.Elements()
               where
                   el.Attribute("attr").Value.Contains("xyz")
               select el

如何创建将应用所述过滤的Linq命令(或foreach循环)?

编辑:首选解决方案不会修改原始数据,而是为视图创建另一个(即Linq查询)。

// first make a list of elements that are to be removed
var forRemoval = new List<XElement>();
foreach (var element in xmlDoc.Descendants())
{
    if (!element.DescendantsAndSelf().Any(e => e.Attribute("attr") != null && e.Attribute("attr").Value.Contains("xyz")))
    {
        forRemoval.Add(element);
    }
}

// then remove the elements
foreach (var xElement in forRemoval)
{
    xElement.Remove();
}

您需要Descendants()来获取document的所有子元素:

var Elements = from el in xdoc.Root.Descendants()
               where
                   el.Attribute("attr").Value.Contains("xyz")
               select el

您可以使用以下LINQ:

var Elements = from el in xdoc.Root.Elements()
               where (el.Attribute("attr") != null && el.Attribute("attr").Value.Contains("xyz")) ||
                   (el.Descendants().Any(x => x.Attribute("attr") != null && x.Attribute("attr").Value.Contains("xyz")))
               select el;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM