Xml, C#, XmlNodeList не получают выбранные узлы

Я новичок в программировании и не понимаю, почему этот код:

XmlNodeList elemPrice = doc.SelectNodes(
    "//Items/Item/Offers/Offer/OfferListing/Price/FormattedPrice");

не давать выбранные узлы. Я смотрел документ xml для получения xpath, и это правильно.

Он дает null в строке searchedItem.Price при попытке выполнить это:

List <SearchedItem> searchedItems = new List<SearchedItem>();

for (int i = 0; i < elemAsin.Count; i++)
{
    SearchedItem searchedItem = new SearchedItem();
    searchedItem.Asin = elemAsin[i].InnerText;
    searchedItem.CurrencyCode = elemCurrencyCode[i].InnerText;
    string price = elemPrice[i].InnerText.Remove(0, 1);
    searchedItem.Price = double.Parse(price);
    searchedItems.Add(searchedItem);
}

return searchedItems;

person Aleksandr Vlasjuk    schedule 09.06.2016    source источник
comment
Пожалуйста, опубликуйте свой xml   -  person Vinod Kumar    schedule 09.06.2016
comment
Я просмотрел документ xml для получения xpath, и это правильно. Если бы это было правильно, это бы работало. Вам нужно включить XML, так как никто не может дать вам ответ.   -  person Charles Mager    schedule 09.06.2016
comment
Вероятно, у вас есть пространство имен в xml, которое вызывает проблему.   -  person jdweng    schedule 09.06.2016
comment
Чтобы мы могли вам помочь, нам нужен минимальный, полный и поддающийся проверке пример вашей проблемы. См. stackoverflow.com/help/how-to-ask.   -  person dbc    schedule 09.06.2016
comment
Привет! Я делаю запрос и получаю ответ: WebRequest request = HttpWebRequest.Create(url); HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse(); Документ XmlDocument = новый XmlDocument(); if (webResponse.StatusCode == HttpStatusCode.OK) { doc.Load(webResponse.GetResponseStream()); XML-ответ амазонки   -  person Aleksandr Vlasjuk    schedule 13.06.2016
comment
Ответ Amazon xml ‹ItemSearchResponse xmlns=webservices.amazon.com/AWSECommerceService/2011-08- 01› ‹Items› ‹Item› ‹ASIN›B00OTWOAAQ‹/ASIN› ‹Offers› ‹Offer› ‹OfferListing› ‹Price› ‹FormattedPrice›$374,33‹/FormattedPrice› ‹/Price› ‹/OfferListing› Предложение› ‹/Предложения› ‹/Товар› ‹/Товары› ‹/ItemSearchResponse›   -  person Aleksandr Vlasjuk    schedule 13.06.2016
comment
Ответ амазонки дает поиск только по 10 предметам. Как получить 13? Любая помощь будет благодарна :)   -  person Aleksandr Vlasjuk    schedule 13.06.2016


Ответы (2)


Предоставляя простой пример выбора узлов с помощью Xpath, попробуйте этот способ

        XmlDocument doc = new XmlDocument();

        doc.Load(@"c:\XMLFile.xml");

        XmlNodeList elemPrice = doc.SelectNodes("/catalog/cd/price");

        for (int i = 0; i < elemPrice.Count; i++)
        {
            Console.WriteLine(elemPrice[i].Name);
            Console.WriteLine(elemPrice[i].InnerText);
        }

<?xml version="1.0" encoding="utf-8" ?> 
<catalog>
  <cd country="USA">
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <price>10.90</price>
  </cd>
  <cd country="UK">
    <title>Hide your heart</title>
    <artist>Bonnie Tyler</artist>
    <price>10.0</price>
  </cd>
  <cd country="USA">
    <title>Greatest Hits</title>
    <artist>Dolly Parton</artist>
    <price>9.90</price>
  </cd>
</catalog>

Выходная цена 10,90 цена 10,0 цена 9,90

person Vinod Kumar    schedule 09.06.2016

Я нашел другой метод анализа XML, который удобен и прост.

 public static List<SearchedItem> ItemSearchResponse(string url)
    {
        List<SearchedItem> searchedItems = new List<SearchedItem>();

        WebRequest request = HttpWebRequest.Create(url);
        HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse();

        XmlDocument doc = new XmlDocument();

        StreamReader reader = new StreamReader(webResponse.GetResponseStream());

        doc.LoadXml(reader.ReadToEnd());

        XmlNodeList listIsValid = doc.GetElementsByTagName("IsValid");

        if (listIsValid.Count > 0 && listIsValid[0].InnerXml == "True")
        {
            XmlNodeList listItems = doc.GetElementsByTagName("Item");

            foreach (XmlNode nodeItem in listItems)
            {
                SearchedItem searchedItem = new SearchedItem();

                foreach (XmlNode nodeChild in nodeItem.ChildNodes)
                {
                    if (nodeChild.Name == "DetailPageURL")
                    {
                        searchedItem.DetailPageURL = nodeChild.InnerText;
                    }

                    else if (nodeChild.Name == "SmallImage")
                    {
                        foreach (XmlNode nodeURLImg in nodeChild.ChildNodes)
                        {
                            if (nodeURLImg.Name == "URL")
                            {
                                searchedItem.SmallImage = nodeURLImg.InnerText;
                            }
                        }
                    }

                    else if (nodeChild.Name == "ItemAttributes")
                    {
                        foreach (XmlNode nodeItemAtributes in nodeChild.ChildNodes)
                        {
                            if (nodeItemAtributes.Name == "Title")
                            {
                                searchedItem.Title = nodeItemAtributes.InnerText;
                            }
                        }
                    }

                    else if (nodeChild.Name == "OfferSummary")
                    {
                        foreach (XmlNode nodeOfferSummary in nodeChild.ChildNodes)
                        {
                            if (nodeOfferSummary.Name == "LowestNewPrice")
                            {
                                foreach (XmlNode nodeLowestNewPrice in nodeOfferSummary.ChildNodes)
                                {
                                    if (nodeLowestNewPrice.Name == "CurrencyCode")
                                    {
                                        searchedItem.CurrencyCode = nodeLowestNewPrice.InnerText;
                                    }

                                    else if (nodeLowestNewPrice.Name == "FormattedPrice")
                                    {
                                        string price = nodeLowestNewPrice.InnerText.Remove(0, 1);
                                        searchedItem.Price = Double.Parse(price);
                                        break;
                                    }
                                }
                            }
                        }
                    }

                    else if (nodeChild.Name == "CustomerReviews")
                    {
                        foreach (XmlNode nodeCustomerReview in nodeChild.ChildNodes)
                        {
                            if (nodeCustomerReview.Name == "Review")
                            {
                                foreach (XmlNode nodeReview in nodeCustomerReview.ChildNodes)
                                {
                                    if (nodeReview.Name == "Content")
                                    {
                                        searchedItem.CustomerReview = nodeReview.InnerText;
                                    }
                                }
                            }
                        }
                    }
                }
                searchedItems.Add(searchedItem);
            }
        }
                    return searchedItems;
    }

Спасибо за помощь!

person Aleksandr Vlasjuk    schedule 13.06.2016