문제

XDocuments 및 DataTables에 데이터 컬렉션이 저장되어 있으며 XPath 쿼리를 사용하여 두 가지 모두를 단일 통합 데이터 공간으로 처리하고 싶습니다.예를 들어 "/Root/Tables/Orders/FirstName"은 "Orders"라는 DataTable의 모든 행에 있는 Firstname 열의 값을 가져옵니다.

DataTable의 모든 레코드를 XDocument에 복사하지 않고 이 작업을 수행할 수 있는 방법이 있습니까?

.Net 3.5를 사용하고 있습니다.

도움이 되었습니까?

해결책 2

결국 나는 이에 대한 답을 스스로 알아냈다.저는 LINQ 식에서 즉시 XML 구조를 만들 수 있는 XStreamingElement라는 클래스를 System.Xml.LINQ에서 발견했습니다.다음은 DataTable을 XML 공간으로 캐스팅하는 예입니다.

Dictionary<string,DataTable> Tables = new Dictionary<string,DataTable>();
// ... populate dictionary of tables ...
XElement TableRoot = new XStreamingElement("Tables",
    from t in Tables
    select new XStreamingElement(t.Key,
               from DataRow r in t.Value.Rows
               select new XStreamingElement("row",
                          from DataColumn c in t.Value.Columns
                          select new XElement(c.ColumnName, r[c])))))

결과는 다음과 유사한 구조를 가진 XElement(TableRoot)입니다. 단, 사전에 두 개의 행이 있는 "Orders"라는 테이블이 하나 포함되어 있다고 가정합니다.

<Tables>
    <Orders>
        <row>
            <sku>12345</sku>
            <quantity>2</quantity>
            <price>5.95</price>
        </row>
        <row>
            <sku>54321</sku>
            <quantity>3</quantity>
            <price>2.95</price>
        </row>
    </Orders>
</Tables>

이는 더 큰 XElement/XDocument 기반 계층 구조와 병합되고 XPath로 쿼리될 수 있습니다.

다른 팁

.nets xpath 재료는 ixpathnavigable 인터페이스에서 작동합니다. 모든 ixpathnavigable에는 ixpathnavigator를 반환하는 CreateNavigator () 메소드가 있습니다.

모든 데이터 소스를 하나의 큰 문서로 노출 시키려면 모든 XPATH 데이터 소스를 포함하는 IXPathNavigable 구현 클래스를 만들어야합니다. CreateNavigator 메소드는 내용을 하나의 큰 데이터 소스로 노출시키는 사용자 정의 XPathNavigator를 반환해야합니다.

불행히도,이 네비게이터를 구현하는 것은 다소 어리 석고, 특히 문서 사이를 점프 할 때주의를 기울여야합니다.

내가 요청한 것과 비슷한 것을 찾고 있습니까? xpath 외국 키?

XPath 권장 사항에 따르면 "XPath의 주요 목적은 XML 문서의 일부를 다루는 것입니다." 하나 이상의 XML 문서의 일부를 해결하기위한 시설이 없습니다. 당신이하려는 일을하고 싶다면 단일 XML 문서를 구축해야합니다.

문서를 병합해야하거나 모든 문서에서 동일한 변환을 수행하지 않도록해야합니다. XPath / XSLT를 수행 할 수없는 경우 문서를 단일 데이터 테이블로 이동 한 다음 DataTable을 필터링하는 것을 고려할 수 있습니다.

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