0

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>

どんな助けでも大歓迎です!

4

2 に答える 2

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>名前、注文、および値の 1 つです。詳細をループして、必要な値を取得できるようになりました。Name、Order、Value はすべて文字列にしましたが、呼び出すGet<type>("name", defaultValueByType)ことで別の型にすることもできます。

次のようにループできます。

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

GetEnumerable は、次の省略形 (この場合) です。

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

ただし、null チェックは自動的に行われます。xml が常に上記の xml を生成する場合は、長時間実行しても問題はありません。Get は適切な値を返します。

注:これはWindowsPhone7プロジェクトであるため、コンパイラ フラグを設定しWindowsPhone7て、拡張機能が問題なくコンパイルされるようにする必要があります (うまくいけば/私はテストしていません)。

于 2012-04-12T19:35:16.747 に答える