2012-04-12 17 views
0

XMLでイベントの説明を取得しようとしていますが、データへのアクセスに問題があります。LinqでXMLを選択する際の問題

eventDetailsValue要素にアクセスしようとしています。ここで

は、私のコードのサンプルです:

(バージョン1)

XElement doc = XElement.Parse(e.Result); 

evtDesc = doc.Element("eventDetails").Element("eventDetails").Element("eventDetailsValue").Element("eventDetailsValue").Value; 

(バージョン2)

XElement doc = XElement.Parse(e.Result); 

var xGood = from detaildoc in doc.Descendants("eventDetails") 
from d in detaildoc.Elements("eventDetail").Elements("eventDetailsValue") 
select d; 

私は別の要素のために次のことを試してみましたが、それが働きました:

GeoLat = Convert.ToDouble(doc.Element("latitude").Value); 

ここにxmlの結果のサンプルがあります(簡略化のために値を削除しました)。

<event> 
    <longitude></longitude> 
    <latitude></latitude> 
    <category></category> 
    <dma></dma> 
    <activeAdvantage></activeAdvantage> 
    <seoUrl></seoUrl> 
    <assetID></assetID> 
    <eventID></eventID> 
    <eventDetailsPageUrl></eventDetailsPageUrl> 
- <mediaTypes> 
    <mediaType></mediaType> 
    <mediaType></mediaType> 
    <mediaType></mediaType> 
    <mediaType></mediaType> 
    <mediaType></mediaType> 
    </mediaTypes> 
    <eventContactEmail /> 
    <eventContactPhone /> 
    <eventName></eventName> 
    <eventDate></eventDate> 
    <eventLocation></eventLocation> 
    <eventAddress></eventAddress> 
    <eventCity></eventCity> 
    <eventState></eventState> 
    <eventZip></eventZip> 
    <eventCountry></eventCountry> 
    <usatSanctioned></usatSanctioned> 
    <regOnline></regOnline> 
    <eventCloseDate></eventCloseDate> 
    <currencyCode></currencyCode> 
    <eventTypeID></eventTypeID> 
    <eventType></eventType> 
    <hasEventResults></hasEventResults> 
    <hasMetaResults></hasMetaResults> 
    <showMap></showMap> 
    <eventContactEmail /> 
    <eventContactPhone /> 
    <displayCloseDate></displayCloseDate> 
    <excludedFromEmailing></excludedFromEmailing> 
    <regOpensMessage /> 
    <regFunnel></regFunnel> 
    <isValid></isValid> 
    <displayRegistration></displayRegistration> 
- <channels> 
- <channel> 
    <channelName></channelName> 
    <primaryChannel></primaryChannel> 
    </channel> 
    </channels> 
- <eventDetails> 
- <eventDetail> 
    <eventDetailsName></eventDetailsName> 
    <eventDetailsOrder></eventDetailsOrder> 
    <eventDetailsValue></eventDetailsValue> 
    </eventDetail> 
- <eventDetail> 
    <eventDetailsName></eventDetailsName> 
    <eventDetailsOrder></eventDetailsOrder> 
    <eventDetailsValue></eventDetailsValue> 
    </eventDetail> 
    </eventDetails> 
    <eventDonationLinks /> 
    <eventSanctions /> 
- <eventCategories> 
- <eventCategory> 
    <categoryID></categoryID> 
    <categoryGroupCount></categoryGroupCount> 
    <categoryName></categoryName> 
    <categoryType></categoryType> 
    <categoryOrder></categoryOrder> 
    <numRegistered></numRegistered> 
    <maxRegistrations></maxRegistrations> 
    <percentFull></percentFull> 
    <displayDate></displayDate> 
    <closeDate></closeDate> 
    <actualCloseDate></actualCloseDate> 
    <isExpired></isExpired> 
- <priceChanges> 
- <priceChange> 
    <price></price> 
    <priceUntilDate></priceUntilDate> 
    </priceChange> 
    </priceChanges> 
    </eventCategory> 
    </eventCategories> 
    <eventUrl></eventUrl> 
    <eventContactUrl></eventContactUrl> 
    <eventImageUrl></eventImageUrl> 
    </event> 

助けていただければ幸いです!

答えて

0

eventDetailsValueはeventDetail要素の配列です。したがって、配列内のどの要素を必要なのかを区別する必要があります。この(これらのLinqToXml拡張子:http://searisen.com/xmllib/extensions.wiki)を使用すると、このようにそれを書き込むことができます。

XElement doc = XElement.Parse(e.Result); 
var details = doc.GetEnumerable("eventDetails/eventDetail", x => new 
{ 
    Name = x.Get("eventDetailsName", string.Empty), 
    Order = x.Get("eventDetailsOrder", string.Empty), 
    Value = x.Get("eventDetailsValue", string.Empty) 
}); 

detailsしたい名前の、注文のと値(複数可)のIEnumerable<object>です。これで、詳細をループして、必要な値を取得できるようになりました。名前、順序、値をすべて文字列にしましたが、Get<type>("name", defaultValueByType)を呼び出すと、代わりに他の型にすることができます。

あなたはこのようにそれらをループすることができます:

foreach(var detail in details) 
{ 
    string value = detail.Value; 
} 

GetEnumerableがために(この場合)速記です:

doc.Element("eventDetails").Elements("eventDetail").Select(x => new ...) 

しかし、それはあなたのためのヌルチェックを行い、そのあなたのXMLが常に生成する場合を上記のxmlは、長い手を差し伸べるには問題はありません。 Getは適切な値を返します。

注:これはWindowsPhone7プロジェクトですので、あなたは拡張子が(うまくいけば/私はそれをテストしていない)文句なしでコンパイルするようWindowsPhone7のコンパイラフラグを設定する必要があります。

+0

次のコードを試しましたが、doc.getenumerableのgetenumerable部分を理解していません。 XElement doc = XElement.Parse(e.Result); VAR詳細= doc.GetEnumerable( "eventDetails/eventDetail"、X =>新しい {NAME = x.Get( "eventDetailsName"、String.Emptyを)、 オーダー= x.Get( "eventDetailsOrder"、ストリング。空)、 値= x.Get( "eventDetailsValue"、string.Empty) }); – HarryM

+0

リンクからXElementExtensions.csファイルをダウンロードしてプロジェクトに追加しましたか?次に、ファイルの先頭に 'using XmlLib;'を置く必要があります。 –

+0

これは完全に機能しました!本当にありがとう! – HarryM

0

は、この文字列で検索してください:

var xGood = from detaildoc in doc.Descendants("eventDetails") 
select new 
{ 
Value = detaildoc.Elements("eventDetail").Elements("eventDetailsValue").Value 
}; 
関連する問題