2016-05-30 5 views
1

LINQ to XMLを使用してWSDL定義から取得するXSDファイルを使用して辞書を構築しようとしています。LINQ to XMLを使用してWSDLからxsdを解析する

私はXMLファイルにこの

<xsd:element maxOccurs="1" minOccurs="0" name="active" type="xsd:boolean"/> 
<xsd:element maxOccurs="1" minOccurs="0" name="activity_due" type="xsd:string"/> 
<xsd:element maxOccurs="1" minOccurs="0" name="additional_assignee_list" type="xsd:string"/> 
<xsd:element maxOccurs="1" minOccurs="0" name="approval" type="xsd:string"/> 
<xsd:element maxOccurs="1" minOccurs="0" name="approval_history" type="xsd:string"/> 
<xsd:element maxOccurs="1" minOccurs="0" name="approval_set" type="xsd:string"/> 
<xsd:element maxOccurs="1" minOccurs="0" name="assigned_to" type="xsd:string"/> 
<xsd:element maxOccurs="1" minOccurs="0" name="assignment_group" type="xsd:string"/> 

リンクのようなものを見て解析しようとしているノードは、次のとおりです。https://dl.dropboxusercontent.com/u/97162408/incident.xml

私は「getKeys」についての唯一の心配です。

基本的に、上記のサンプルノードリストから "name"と "type"のキーと値のペアを与える辞書を構築したいと思っています。

私は今、私は結果リストを解析するために別のルーチンを記述することなく、1つの関数呼び出しで辞書を構築したかった私は、コード

XNamespace ns = XNamespace.Get("http://www.w3.org/2001/XMLSchema"); 

XDocument xd = XDocument.Load(url); 

var result = (from elements in xd.Descendants(ns + "element") where elements.Attribute("name").Value.Equals("getKeys") 

          select elements.Descendants(ns + "sequence") 
         ); 

を使用してノードリストに得ることができるポイントに持っていますLINQ to XMLを使用します。ヒント、コードサンプルは本当に役に立つでしょう!

答えて

5

ToDictionaryはあなたの友人です。あなたが1つのステートメントでそれをすべて行うことができます。

var query = xd 
    .Descendants(ns + "element") 
    .Single(element => (string) element.Attribute("name") == "getKeys") 
    .Element(ns + "complexType") 
    .Element(ns + "sequence") 
    .Elements(ns + "element") 
    .ToDictionary(x => (string) x.Attribute("name"), 
        x => (string) x.Attribute("type")); 

を基本的には最初の3行はgetKeysの名前を持つ唯一の要素を見つけ、今後2〜3行が、あなたならば、あなただけのDescendants(ns + "element")を使用することができます(その下xsd:elementパーツを選択します必要な)、最後の呼び出しは要素のシーケンスをDictionary<string, string>に変換します。

関連する問題