0

Datatable に変換したい LinQ XDocument (SOAP 応答から) があります。これが私が扱っているXMLです。名前空間を使用して、問題をさらに複雑にしています。

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <ns2:getDetailsResponse xmlns:ns2="http://service.xyz.com/">
            <return>
                <meeting meetingCode="8">
                    <meetingDate>2013-07-08T00:00:00+10:00</meetingDate>
                    <actionList>
                        <actionCoOrdinator>The action man</actionCoOrdinator>
                        <action>
                            <actionType>Type1</actionType>
                            <actionBy>John</actionBy>
                        </action>
                        <action>
                            <actionType>Type2</actionType>
                            <actionBy>Mary</actionBy>
                        </action>
                        <action>
                            <actionType>Type3</actionType>
                            <actionBy>Phil</actionBy>
                        </action>
                    </actionList>
                </meeting>
            </return>
        </ns2:getDetailsResponse>
    </soap:Body>
</soap:Envelope>

そして、これがDataTableに必要な出力です

    MeetingCode MeetingDate ActionCoOrdinator ActionType ActionBy
    ----------- -------------------------- -------------- --- ---------- --------
    8 2013-07-08T00:00:00+10:00 アクションマン Type1 ジョン
    8 2013-07-08T00:00:00+10:00 アクションマン Type2 メアリー
    8 2013-07-08T00:00:00+10:00 アクションマン Type3 フィル

ご覧のとおり、「actionList」内の「アクション」要素ごとに行が必要ですが、行ごとに親/祖父母要素からの情報も必要です。この段階で私が持っているのは、以下のコードを使用した XDocument だけです。

XDocument myXDoc = XDocument.Parse(soapStringResult);

このサイトで XDocument からのデータの抽出に関するさまざまな投稿を見てきましたが、私の問題は、必要なデータ項目が事前にわからないことです。私の出発点は、「行」を表す xPath です。Xパスは

ns2:getDetailsResponse/return/meeting/actionList/action

次に、この Xpath に対して必要なすべてのデータ項目を含む DB テーブルがあります。テーブルはこんな感じ

    XpathDataItem
    ----------------------
    ../../@meetingCode
    ../../会議日
    ../actionCoOrdinator
    アクションタイプ
    によるアクション

探しているデータ項目の Xpath がわかっている場合は、データを DataTable に読み込むことができますが、不明な XPath のセットを使用してそれを行う方法がわかりません。

前もってありがとうジョン

4

1 に答える 1

0

不明な部分は?取得する開始点または個々の要素? それはあなたの質問からは明らかではありません。単に開始点がわからない場合は、Linq-to-xml が最適です。

通常、Linq-to-xml は xpath に基づいて要素を取得しません。Elements()メソッドとメソッドを使用するとDescendants()、特定のパスを知らなくても xml データを照会できます。

パスに関係なくを取得するには、次のようなメソッドmeetingDateを使用できます。Descendants()

var meetingDateElement = myXDoc.Descendants("meetingDate").SingleOrDefault;
if (meetingDateElement != null) {
    var meetingDate = meetingDateElement.Value;
}

meetingCodeactionCoOrdinator同様の方法で見つけることができます。

すべてのaction要素を取得するには、単純に を使用しますmyXDoc.Descendants("action")。このようなものは、各アクションの値を取得します:

var actions = from a in myXDoc.Descendants("action")
              select new {
                             actionType = a.Element("actionType").Value,
                             actionBy = a.Element("actionBy").Value
                          };

解析している xml に複数のmeeting要素が含まれる可能性がある場合は、`myXDoc.Descendants("meeting") を使用してすべての会議を取得し、クエリまたは foreach ステートメント内の子要素を取得します。

于 2013-10-31T16:11:31.313 に答える