Я создал проект для чтения Amazon рекламы продукта API, извлекая документ XML, используя следующий код:Найти Xml Узел Узла Значение
WebRequest request = HttpWebRequest.Create(signedurl);
WebResponse responseStream = request.GetResponse();
XmlDocument doc = new XmlDocument();
doc.Load(responseStream.GetResponseStream());
И, в ходе дальнейших исследований я смог получить доступ к элементу значения, используя следующее;
XmlNode Item_IdNode = doc.GetElementsByTagName("ASIN").Item(0);
XmlNode PriceNode = doc.GetElementsByTagName("FormattedPrice").Item(3);
string F_Price = PriceNode.InnerText;
string xml_ItemId = Item_IdNode.InnerText;
Этот код отлично работает для доступа продукт ASIN и цену для одной записи, но я хотел бы получить до 10 записей в запросе.
До сих пор я знаю, что могу увеличивать «Item (0)» до другого элемента ASIN, но элемент «FormattedPrice» повторяется много раз для каждого продукта и может не обязательно отображаться в точке 6,9 , 12 для других записей продукта.
Для каждого из 10 зачисленных записей я уже знаю (используйте) ASIN (уникальная ссылка на продукт) в вызове api для выбора конкретных записей.
Где я хотел бы продвигать код, чтобы «искать» ответ XML для элемента ASIN «12345», затем перейти к конкретному узлу «OfferSummary/LowestNewPrice/FormattedPrice», чтобы получить цену товара в переменную , и т. д. для всех других цен товаров ASIN.
Вот выдержка из первых двух записей элемента XML (если это помогает).
<Items>
<Request>
<IsValid>True</IsValid>
<ItemLookupRequest>
<Item><ASIN>12345</ASIN>
<OfferSummary>
<LowestNewPrice>
<Amount>1098</Amount>
<CurrencyCode>GBP</CurrencyCode>
<FormattedPrice>£10.98</FormattedPrice>
</LowestNewPrice>
</OfferSummary>
.
.
.
.
<Items>
<Request>
<IsValid>True</IsValid>
<ItemLookupRequest>
<Item><ASIN>23456</ASIN>
<OfferSummary>
<LowestNewPrice>
<Amount>1098</Amount>
<CurrencyCode>GBP</CurrencyCode>
<FormattedPrice>£10.98</FormattedPrice>
</LowestNewPrice>
</OfferSummary>
.
.
.
.
У меня есть asp.net опыт, но раньше не использовали XML «читатели» и был бы признателен за любые указатели в правильном направлении на «Поиск» файла XML для каждого ASIN, и его соответствующей «FormattedPrice».
Надеюсь, что это достаточная информация, пожалуйста, дайте мне знать, если потребуется какая-либо дополнительная информация.
Большое спасибо, Джеймс
EDITED UPDATE: 11 января 2016
Большое спасибо за ответы каждого, я работал, чтобы включить ваши ответы в рабочий образец в моем коде (за последнюю неделю , пытаясь понять это для себя). Хотя после многих дней для попытки у меня все еще нет окончательного рабочего решения.
Я адаптировал свой «запрос» следующим образом:
var res = XElement.Load(Server.MapPath("/App_Data/AWSS.xml"))
.Descendants("ASIN").FirstOrDefault(elem => elem.Value == "B001MS70F2")
.Parent.Descendants("FormattedPrice").Select(elem => elem.Value)
.FirstOrDefault();
Response.Write(res);
Который работает до точки, но в моем первоначальном посте я только отправил выписку из полных данных XML. Вышеприведенный код работает для образца XML, который я предоставил, но не для полных данных, которые включают в себя то, что я считаю «root». Если я удалю узел «ItemLookupResponse» (и запросить декодеры), код работает, но не для всех XML-данных, как показано ниже;
<ItemLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01">
<OperationRequest>
<HTTPHeaders>
<Header Name="UserAgent" Value="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36"/>
</HTTPHeaders>
<RequestId>#############</RequestId>
<Arguments>
<Argument Name="AWSAccessKeyId" Value="#############"/>
<Argument Name="AssociateTag" Value="#############"/>
<Argument Name="IdType" Value="ASIN"/>
<Argument Name="ItemId" Value="B001MS70F2,B007W1RSZA"/>
<Argument Name="Operation" Value="ItemLookup"/>
<Argument Name="ResponseGroup" Value="Offers"/>
<Argument Name="Service" Value="AWSECommerceService"/>
<Argument Name="Timestamp" Value="2016-01-06T23:01:02Z"/>
<Argument Name="Signature" Value="#############"/>
</Arguments>
<RequestProcessingTime>0.0209750000000000</RequestProcessingTime>
</OperationRequest>
<Items>
<Request>
<IsValid>True</IsValid>
<ItemLookupRequest>
<IdType>ASIN</IdType>
<ItemId>B001MS70F2</ItemId>
<ItemId>B007W1RSZA</ItemId>
<ResponseGroup>Offers</ResponseGroup>
<VariationPage>All</VariationPage>
</ItemLookupRequest>
</Request>
<Item>
<ASIN>B001MS70F2</ASIN>
<ParentASIN>B019IGAHUY</ParentASIN>
<OfferSummary>
<LowestNewPrice>
<Amount>1049</Amount>
<CurrencyCode>GBP</CurrencyCode>
<FormattedPrice>£10.49</FormattedPrice>
</LowestNewPrice>
<TotalNew>32</TotalNew>
<TotalUsed>0</TotalUsed>
<TotalCollectible>0</TotalCollectible>
<TotalRefurbished>0</TotalRefurbished>
</OfferSummary>
<Offers>
<TotalOffers>1</TotalOffers>
<TotalOfferPages>1</TotalOfferPages>
<MoreOffersUrl>
http://www.amazon.co.uk/gp/offer-listing/B001MS70F2%3FSubscriptionId%3DAKIAI4V5X2Q7F3BOU7MA%26tag%3Dbusin02-21%26linkCode%3Dxm2%26camp%3D2025%26creative%3D12734%26creativeASIN%3DB001MS70F2
</MoreOffersUrl>
<Offer>
<OfferAttributes>
<Condition>New</Condition>
</OfferAttributes>
<OfferListing>
<OfferListingId>
VbyiDUr1A7VXNun65VvEF8WmWG3ZOzirk%2BGjIdOOGBB38lLlcRYaEKyl4pS6hdrqhZuOLqfW4uTVLtqsCUfanWyEaltghotq
</OfferListingId>
<Price>
<Amount>1049</Amount>
<CurrencyCode>GBP</CurrencyCode>
<FormattedPrice>£10.49</FormattedPrice>
</Price>
<AmountSaved>
<Amount>284</Amount>
<CurrencyCode>GBP</CurrencyCode>
<FormattedPrice>£2.84</FormattedPrice>
</AmountSaved>
<PercentageSaved>21</PercentageSaved>
<Availability>Usually dispatched within 24 hours</Availability>
<AvailabilityAttributes>
<AvailabilityType>now</AvailabilityType>
<MinimumHours>0</MinimumHours>
<MaximumHours>0</MaximumHours>
</AvailabilityAttributes>
<IsEligibleForSuperSaverShipping>1</IsEligibleForSuperSaverShipping>
<IsEligibleForPrime>1</IsEligibleForPrime>
</OfferListing>
</Offer>
</Offers>
</Item>
<Item>
<ASIN>B007W1RSZA</ASIN>
<OfferSummary>
<LowestNewPrice>
<Amount>1630</Amount>
<CurrencyCode>GBP</CurrencyCode>
<FormattedPrice>£16.30</FormattedPrice>
</LowestNewPrice>
<TotalNew>7</TotalNew>
<TotalUsed>0</TotalUsed>
<TotalCollectible>0</TotalCollectible>
<TotalRefurbished>0</TotalRefurbished>
</OfferSummary>
<Offers>
<TotalOffers>1</TotalOffers>
<TotalOfferPages>1</TotalOfferPages>
<MoreOffersUrl>
http://www.amazon.co.uk/gp/offer-listing/B007W1RSZA%3FSubscriptionId%3DAKIAI4V5X2Q7F3BOU7MA%26tag%3Dbusin02-21%26linkCode%3Dxm2%26camp%3D2025%26creative%3D12734%26creativeASIN%3DB007W1RSZA
</MoreOffersUrl>
<Offer>
<OfferAttributes>
<Condition>New</Condition>
</OfferAttributes>
<OfferListing>
<OfferListingId>
VbyiDUr1A7VXNun65VvEF74FLb5xO3BqKAr7e2DBjtDJNt3ZXQTDuPuGzaLdifzl2xEs1x4swNRE3U6yP3JfXvjWXxBDUM1vGxR8eaR1suappuRh5ZARKbjoGHx3NvEpVdrLfxvwmIzXoFSSq50uWg%3D%3D
</OfferListingId>
<Price>
<Amount>1630</Amount>
<CurrencyCode>GBP</CurrencyCode>
<FormattedPrice>£16.30</FormattedPrice>
</Price>
<Availability>Usually dispatched within 1-2 business days</Availability>
<AvailabilityAttributes>
<AvailabilityType>now</AvailabilityType>
<MinimumHours>24</MinimumHours>
<MaximumHours>48</MaximumHours>
</AvailabilityAttributes>
<IsEligibleForSuperSaverShipping>0</IsEligibleForSuperSaverShipping>
<IsEligibleForPrime>0</IsEligibleForPrime>
</OfferListing>
</Offer>
</Offers>
</Item>
</Items>
</ItemLookupResponse>
Я пробовал много перестановок кода, который привел меня к выводу, что удаление узла «» ItemLookupResponse дает мне ошибку «несколько элементов корня». Но удаление «ItemLookupResponse» и «OperationRequest» дает мне рабочий код.
Использование моего адаптированного «запроса» (выше) в полном ответе XML дает мне ошибку «Ссылка на объект не установлена в экземпляр объекта».
Я был бы очень признателен, если бы кто-нибудь мог указать мне в правильном направлении, чтобы запустить мой адаптированный запрос на полный XML и преодолеть ошибку «Ссылка на объект, не установленную на экземпляр объекта».
Большое спасибо, Джеймс
Вы можете использовать ['XElement'] (https://msdn.microsoft.com/en-us/library/system.xml.linq.xelement (v = vs.110) .aspx) класс или [' XDocument '] (https://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument (v = vs.110) .aspx) и найти itenm с помощью linq –