linq를 통해 xaml 개체 그래프의 일부를 xml로 추출하려면 어떻게 해야 합니까?

StackOverflow https://stackoverflow.com/questions/45732

  •  09-06-2019
  •  | 
  •  

문제

xaml로 직렬화된 개체 그래프가 있습니다.대략적인 샘플은 다음과 같습니다.

<MyObject xmlns.... >
    <MyObject.TheCollection>
        <PolymorphicObjectOne .../>
        <HiImPolymorphic ... />
    </MyObject.TheCollection>
</MyObject>

TheCollection 내에서 직렬화된 개체를 추출하기 위해 Linq to XML을 사용하고 싶습니다.

메모: MyObject 런타임 시 이름이 다르게 지정될 수 있습니다.나는 동일한 인터페이스를 구현하는 모든 객체에 관심이 있습니다. TheCollection 다음 유형이 포함된 IPolymorphicLol.

런타임 시 내가 아는 유일한 것은 컬렉션을 찾을 수 있는 깊이와 컬렉션 요소의 이름이 ``*.TheCollection`이라는 것입니다.다른 모든 것은 바뀔 것입니다.

XML은 Linq를 사용하여 데이터베이스에서 검색됩니다.두 쿼리를 결합할 수 있다면 직렬화된 전체 그래프를 가져온 다음 컬렉션 개체를 추출하는 대신 유용한 컬렉션을 다시 가져올 수 있습니다.

도움이 되었습니까?

해결책

할 것이다,

XAML을 보고 개체가 일부 인터페이스를 구현하는지 여부를 알아내는 것은 불가능합니다.
주어진 제약 조건을 사용하면 라는 하위 항목이 있는 xml 요소를 찾을 수 있습니다.

다음 코드를 사용할 수 있습니다.이름이 다음으로 끝나는 하위 요소를 갖는 모든 요소를 ​​반환합니다. .더컬렉션

    static IEnumerable<XElement> FindElement(XElement root)
    {
        foreach (var element in root.Elements())
        {
            if (element.Name.LocalName.EndsWith(".TheCollection"))
            {
                yield return element.Parent;
            }
            foreach (var subElement in FindElement(element))
            {
                yield return subElement;
            }
        }
    }

이 요소가 나타내는 개체가 일부 인터페이스를 구현하는지 확인하려면 어셈블리에서 메타데이터를 읽어야 합니다.리플렉션을 사용하지 않고 어셈블리의 유형을 분석하려면 Mono.Cecil 프레임워크를 사용하는 것이 좋습니다.

다른 팁

@aku
예, xaml에는 기본 유형이나 인터페이스에 대한 표시가 포함되어 있지 않다는 것을 알고 있습니다.그러나 나는 컴파일 타임에 루트 개체의 인터페이스와 컬렉션이 보유하는 인터페이스를 알고 있습니다.

직렬화된 그래프는 SQL 데이터베이스에 XML로 저장되며 linq를 사용하여 XElements로 검색합니다.현재 솔루션과 함께 그래프를 역직렬화하고, 반복하고, 컬렉션에서 원하는 개체를 꺼내고, 해당 개체에 대한 모든 참조를 제거한 다음 해당 부모를 삭제하는 것으로 제한됩니다.그것은 모두 매우 복잡합니다.나는 단일 스트로크 솔루션을 원했습니다.xpath의 라인을 따라 뭔가가 있지만 우리가 찾고 있는 요소만 반환하는 linq to sql 쿼리와 인라인입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top