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 명령은 첫 번째 요소 수준 (루트 이후) 만 정렬합니다.
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();
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다