2012-04-12 6 views
0

Ich versuche, eine Ereignisbeschreibung in XML ziehen, aber ich habe Probleme beim Zugriff auf die Daten.C# - Probleme Auswahl von XML mit Linq

Ich versuche, auf das Element eventDetailsValue zuzugreifen. Hier

ist eine Probe von meinem Code:

(Version 1)

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

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

(version2)

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

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

Ich habe versucht, die folgenden für ein anderes Element und es funktionierte:

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

Hier ist ein Beispiel des xml-Ergebnisses (ich entfernte die Werte der Einfachheit halber):

<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> 

Jede Hilfe wäre willkommen!

Antwort

0

Die eventDetailsValue ist in einer Reihe von Elementen Eventdetail. Sie müssen also unterscheiden, welches Element in dem Array Sie möchten. Mit diesem (und diese LinqToXml Erweiterungen: http://searisen.com/xmllib/extensions.wiki) können Sie es wie folgt schreiben:

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 ein IEnumerable<object> des Namens ist, Ordens und der Wert (e) Sie wollen. Sie können nun Details durchlaufen und die gewünschten Werte erhalten. Ich habe Name, Reihenfolge und Wert alle Strings gemacht, aber indem Sie Get<type>("name", defaultValueByType) aufrufen, können Sie sie stattdessen andere Typen haben.

können Sie Schleife durch sie wie folgt aus:

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

GetEnumerable Stenografie ist (in diesem Fall) für:

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

Aber es hat null für Sie überprüft, die, wenn Ihr xml immer produziert die oben genannten xml, gäbe es keine Probleme, es lang zu tun. Und Get gibt den richtigen Wert zurück.

Hinweis: Da dies ein WindowsPhone7 Projekt ist, erhalten Sie einen Compiler-Flag von WindowsPhone7 setzen müssen, so dass die Erweiterungen ohne Beschwerde kompilieren (hoffentlich/ich habe es nicht getestet).

+0

Ich habe versucht den folgenden Code, aber es ist nicht zu verstehen, die "getenumerable" Teil für doc.getenumerable XElement doc = XElement.Parse (e.Result); var details = doc.GetEnumerable ("Veranstaltungsdetails/Eventdetail", x => new { Name = x.Get ("eventDetailsName", string.Empty), Order = x.Get ("eventDetailsOrder", string. Leer), Wert = x.Get ("eventDetailsValue", string.Empty) }); – HarryM

+0

Haben Sie die Datei XElementExtensions.cs vom Link heruntergeladen und zu Ihrem Projekt hinzugefügt? Dann müssen Sie eine 'using XmlLib;' am Anfang der Datei einfügen. –

+0

Das hat perfekt funktioniert!Vielen Dank! – HarryM

0

Diese Abfrage:

var xGood = from detaildoc in doc.Descendants("eventDetails") 
select new 
{ 
Value = detaildoc.Elements("eventDetail").Elements("eventDetailsValue").Value 
};