【问题标题】:Xml, C#, XmlNodeList do not get selected nodesXml、C#、XmlNodeList 未获取选定节点
【发布时间】:2016-06-09 09:24:52
【问题描述】:

我是编程新手,不明白为什么会出现这样的代码:

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

不要给选定的节点。我查看了获取 xpath 的 xml 文档,它是正确的。

当尝试执行此操作时,它在 searchedItem.Price 行中给出 null:

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;

【问题讨论】:

  • 请发布您的xml
  • “我查看了获取 xpath 的 xml 文档,它是正确的”。这是正确的,它会起作用的。您需要包含 XML,因为目前没有人可以给您答案。
  • 您可能在 xml 中有一个命名空间导致问题。
  • 为了让我们帮助您,我们需要看到您的问题的Minimal, Complete, and Verifiable example。见stackoverflow.com/help/how-to-ask
  • 您好!我提出请求并得到响应: WebRequest request = HttpWebRequest.Create(url); HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse(); XmlDocument 文档 = 新 XmlDocument(); if (webResponse.StatusCode == HttpStatusCode.OK) { doc.Load(webResponse.GetResponseStream());亚马逊 xml 响应

标签: c# xml parsing xpath xmlnodelist


【解决方案1】:

提供一个用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

【讨论】:

    【解决方案2】:

    我找到了其他解析 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;
        }
    

    感谢您的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2014-09-28
      • 2013-08-12
      • 1970-01-01
      • 2011-05-30
      • 2012-03-06
      • 1970-01-01
      相关资源
      最近更新 更多