DOTNET: eBay SDK und CountryDetailList
Wer derzeit mit dem eBay SDK für .NET arbeitet, wird eine böse Erfahrung erleben, wenn er die von eBay bereitgestellte Liste der möglichen Artikelstandorte herunterladen möchte. Folgender Code führt beim derzeitigen Stand des SDKs (Version 523) zu einer Exception:
// Create the call
GeteBayDetailsCall details =
new GeteBayDetailsCall(
details.Site = SiteCodeType.Germany
details.EnableCompression = true;
// List of countries
CountryDetailsTypeCollection countries = null;
// Execute the call
try
{
// Get the countries
details.GeteBayDetails(
new DetailNameCodeTypeCollection(
new DetailNameCodeType[] {
DetailNameCodeType.CountryDetails }));
// Assign the countries
countries = details.CountryDetailList;
}
catch (Exception ex)
{
// Handle the exception
}
Unweigerlich springt das Ding in den catch-Block und meldet, dass der CountryCode-Typ “ME” (steht für “Montenegro”) nicht einem Element der CountryCodeType-Auflistung zugeordnet werden kann (“Instanzvalisierungsfehler: ‘ME’ ist kein gültiger Wert für CountryCodeType”). Selbiges gilt übrigens für das Element “RS” (für Serbien).
Schaut man sich die CountryCodeType-Auflistung an, wird man auch feststellen, dass es dort kein “ME”-Element gibt. Damit wäre ganz elegant jede .NET-Applikation von der eBay-Nutzung ausgeschlossen, die sich an die eBay-BestPractices hält.
Wenn es nicht einen Workaround gäbe: Man nehme das zurückgegebene SOAP und parse das manuell durch. So man es benötigt, wandele man die Elemente dann händisch in die korrekten Elemente um und generiere die Liste der Länder händisch. Dabei muss man lediglich die Ausnahme abfangen, die auftritt, wenn man versucht, den Wert “ME” in ein Element der CountryCodeType-Auflistung zu konvertieren. Folgender Code muss in den catch-Block, damit es funktioniert:
// Get the SOAP
string soap = details.SoapResponse;
// Parse the SOAP directly
XmlDocument soapDoc = new XmlDocument();
soapDoc.LoadXml(soap);
XmlNamespaceManager mgr =
new XmlNamespaceManager(soapDoc.NameTable);
mgr.AddNamespace(“soap”, “http://schemas.xmlsoap.org/soap/envelope/”);
mgr.AddNamespace(“xsd”, “http://www.w3.org/2001/XMLSchema”);
mgr.AddNamespace(“xsi”, “http://www.w3.org/2001/XMLSchema-instance”);
mgr.AddNamespace(“ebay”, “urn:ebay:apis:eBLBaseComponents”);
XmlNodeList countries = soapDoc.SelectNodes(
“//ebay:CountryDetails”, mgr);
CountryDetailsTypeCollection cdc =
new CountryDetailsTypeCollection();
foreach (XmlNode countryInfo in countries)
{
// Name und Beschreibung auslesen
string countryName = countryInfo.SelectSingleNode(
“./ebay:Country”, mgr).InnerText;
string countryDescr = countryInfo.SelectSingleNode(
“./ebay:Description”, mgr).InnerText;
try
{
// Erzeugen des CountryDetailsTypes
CountryDetailsType cdt = new CountryDetailsType();
cdt.Country = (CountryCodeType)
Enum.Parse(typeof(CountryCodeType), countryName);
cdt.Description = countryDescr;
// Merken
cdc.Add(cdt);
}
catch { }
}
countries = cdc;
Wenn man das umgesetzt hat, funktioniert auch der Abruf der Länder wieder korrekt.
Aber peinlich isses schon für die Herrschaften, gelle?