【问题标题】:Parse XML null reference exception error? C# ASP解析 XML 空引用异常错误? C# ASP
【发布时间】:2012-06-28 09:11:08
【问题描述】:

我已经坚持一个简单的 API 用法已经一个多星期了。以下是详细信息。

尝试对 ebay.com 进行 api 调用。 这是我的代码的样子...

这是起始页代码:

 protected void Button1_Click(object sender, EventArgs e)
    {
        Response.Redirect("Results.aspx?Keywords=" + searchString.Text);  
    }

页面被定向到这段代码:

if (Request.QueryString["Keywords"] != null){
        string keywords = Request.QueryString["Keywords"];
            string myAppID = "HIDDEN";
            var xml = XDocument.Load("http://svcs.ebay.com/services/search/FindingService/v1?OPERATION-NAME=findItemsByKeywords&SERVICE-VERSION=1.0.0&SECURITY-APPNAME=" + myAppID + "&RESPONSE-DATA-FORMAT=XML&REST-PAYLOAD&keywords=" + keywords + "&paginationInput.entriesPerPage=5");
            XNamespace ns = "http://www.ebay.com/marketplace/search/v1/services";
            var titles = from item in xml.Root.Descendants(ns + "title")
                              select new{
                                  title = xml.Descendants(ns + "title").Select (x => x.Value),
                              };
        foreach (var item in titles){
                Label1.Text += item;
            } 
        }

这是 xml 示例:

<findItemsByKeywordsResponse xmlns="http://www.ebay.com/marketplace/search/v1/services">
<searchReslut count="5">
<item>
    <title></title>
</item>
<item>
    <title></title>
</item>
<item>
    <title></title>
</item>

我真的宁愿将项目变成一个数组,而不仅仅是列出它们。只是想我会先尝试更简单的方法。我得到的错误是: 我的标签的 for 循环输出如下所示:

{ title = System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Xml.Linq.XElement,System.String] }{ title = System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Xml.Linq.XElement,System.String] }{ title = System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Xml.Linq.XElement,System.String] }{ title = System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Xml.Linq.XElement,System.String] }{ title = System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Xml.Linq.XElement,System.String] }

并且输出异常是:

在 mscorlib.dll 中发生了“System.Threading.ThreadAbortException”类型的第一次机会异常 mscorlib.dll 中出现“System.Threading.ThreadAbortException”类型的异常,但未在用户代码中处理 线程 '' (0x27ee4) 已退出,代码为 0 (0x0)。

感谢任何帮助!

【问题讨论】:

  • 样本中的 XML 太大了。我强烈建议将其缩小(大约 7-10 行),但仍然有效并重现问题。我怀疑您会在这样做时找到错误的来源。如果不是 - 会更容易回答。
  • 以上编辑感谢 Alexei

标签: c# asp.net xml linq ebay-api


【解决方案1】:

异常来自:

var titles = from item in xml.Root.Descendants(ns + "title")
             select new
             {
                 title = item.Parent.Element("title").Value,
             };

你不需要去父母那里,你可以直接得到title的值,因为那是你要搜索的:

xml.Descendants(ns + "title").Select (x => x.Value)

另外,请看这里Asking Better Questions,因为它可能会让您得到更快/更好的响应。您的问题中有大量不相关的代码,并且很难解析以获取您实际需要帮助的内容。

【讨论】:

  • 但是有多个标题...我会试一试你的代码,看看它是否有效!
  • 查询的第一部分(Descendants 部分)选择 xml 中的所有标题元素,而选择只是取每个的值。它将在整个 XDocument 中获得任何名为“title”的内容。如果这不是您要查找的内容,请更新问题。
  • 不,这似乎确实有效。但是现在当我通过 for 循环获取该代码时,我得到了这个:title = System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Xml.Linq.XElement,System.String]
  • 那是因为标题还不知道(延迟执行)。你运行它并得到一个异常?
  • mscorlib.dll 中出现“System.Threading.ThreadAbortException”类型的第一次机会异常 mscorlib.dll 中出现“System.Threading.ThreadAbortException”类型的异常,但未在用户代码中处理
【解决方案2】:

这应该很容易完成。尝试使用下面的代码。我只是从您的示例中设置示例 XML 并将其解析为 XElement(注意:缺少一些结束标记,我还假设“searchReslut”节点应该是“searchResult”)。接下来,我从根节点中获取名称为“title”且值不为空的所有后代节点。然后我只是循环通过创建的 IEnumerable,并连接标签的文本。如果有任何问题,请告诉我。

string ns = "http://www.ebay.com/marketplace/search/v1/services";
string returnedXml = "<findItemsByKeywordsResponse xmlns=\"" + ns + "\">" +
                    "<searchReslut count=\"5\">" +
                        "<item>" +
                            "<title>Title1</title>" +
                        "</item>" +
                        "<item>" +
                            "<title>Title2</title>" +
                        "</item>" +
                        "<item>" +
                            "<title>Title3</title>" +
                        "</item>" +
                     "</searchReslut>" +
                    "</findItemsByKeywordsResponse>";
        XElement xml = XElement.Parse(returnedXml);
        IEnumerable<XElement> titleNodes = xml.Descendants("title").Where(x => x.Value != null);
        foreach (XElement t in titleNodes)
        {
            Label1.Text += t.Value;
        }            

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    相关资源
    最近更新 更多