XDocument在尝试获取其值之前检查数据

时间:2018-08-04 09:42:52

标签: c#

请检查以下C#代码。在这里,我从以下xml示例中获取UPC的值,EAN值。但是当前代码的问题是UPC一段时间,xml中没有EAN值,然后出现错误-未将对象设置为实例...所以我的问题是,在尝试之前,如何检查UPC EAN是否为null抓住它的价值?所以我不会得到这种丢失的数据错误?有什么想法要解决吗?

C#代码:

Stream requestStream = request.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close();
using (var response = (HttpWebResponse)request.GetResponse())
{
    if (response.StatusCode == HttpStatusCode.OK)
    {
        Stream responseStream = response.GetResponseStream();
        string responseStr = new StreamReader(responseStream).ReadToEnd();
        responseStream.Flush();
        responseStream.Close();

        XDocument doc = XDocument.Parse(responseStr);
        XNamespace ns = doc.Root.GetDefaultNamespace();
        string UPC = "";
        string EAN = "";
        if (doc.Descendants(ns + "Ack").FirstOrDefault().Value != "Failure")
        {
            UPC = doc.Descendants(ns + "UPC").FirstOrDefault().Value;
            EAN = doc.Descendants(ns + "EAN").FirstOrDefault().Value;
        }

XML:

<?xml version="1.0" encoding="UTF-8"?>
<GetItemResponse xmlns="urn:ebay:apis:eBLBaseComponents">
<Timestamp>2018-08-04T09:36:11.502Z</Timestamp>
<Ack>Success</Ack>
<Version>1069</Version>
<Build>E1069_CORE_API_18748854_R1</Build>
<Item>
    <ProductListingDetails>
        <ISBN>Does not apply</ISBN>
        <UPC>732030007789</UPC>
        <BrandMPN>
            <Brand>Ommani</Brand>
            <MPN>H0149-OM</MPN>
        </BrandMPN>
        <IncludeeBayProductDetails>true</IncludeeBayProductDetails>
    </ProductListingDetails>
</Item>
</GetItemResponse>

错误图片: pic

1 个答案:

答案 0 :(得分:2)

您正在使用FirstOrDefault(),这表明您知道它可能不存在-但是您无条件地在使用Value属性,如果{ {1}}返回null。

两个选项:

  • 使用空条件运算符:

    NullReferenceException
  • 使用从FirstOrDefault()UPC = doc.Descendants(ns + "UPC").FirstOrDefault()?.Value; 的显式转换,它将为空输入返回空输出:

    XElement

在两种情况下,如果没有这样的元素,string最终将为null。