Search code examples
c#linq-to-xmlextension-methodsienumerablexelement

Why do non-null XElements cause an NRE?


Why is my extension method GetVendorForXMLElement() erupting in an NRE when I pass it XElements with data?

The same code (except for the custom class used, which here is "Vendor") works with other classes/data, but not here. I get an NRE in the GetVendorForXMLElement() method.

private void buttonVendors_Click(object sender, EventArgs e)
{
    IEnumerable<Vendor> vendors = GetCollectionOfVendors();
}

private IEnumerable<Vendor> GetCollectionOfVendors()
{
    ArrayList arrList = FetchDataFromServer("http://localhost:21608/api/vendor/getall/dbill/ppus/42"); 
    String contents = "<Vendors>";
    foreach (String s in arrList)
    {
        contents += s;
    }
    contents += "</Vendors>";
    String unwantedPreamble = "<ArrayOfVendor xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://schemas.datacontract.org/2004/07/CStore.DomainModels.HHS\">";
    contents = contents.Replace(unwantedPreamble, String.Empty);
    contents = contents.Replace("</ArrayOfVendor>", String.Empty);
    MessageBox.Show(contents);
    XDocument xmlDoc = XDocument.Parse(contents);
    // The result (NRE) is the same with any one of these three "styles" of calling Select()
    //IEnumerable<Vendor> vendors = xmlDoc.Descendants("Vendor").Select(GetVendorForXMLElement).ToList();
    //IEnumerable<Vendor> vendors = xmlDoc.Descendants("Vendor").Select(x => GetVendorForXMLElement(x));
    IEnumerable<Vendor> vendors = xmlDoc.Descendants("Vendor").Select<XElement, Vendor>(GetVendorForXMLElement);
    return vendors;
}

private static Vendor GetVendorForXMLElement(XElement vendor) 
{
    return new Vendor
    {
        CompanyName = vendor.Element("CompanyName").Value,
        VendorID = vendor.Element("VendorID").Value                
    };
}

public class Vendor
{
    public String CompanyName { get; set; } 
    public String VendorID { get; set; }
    public String siteNum { get; set; }
}

There is data; this is what I see with the MessageBox.Show() call prior to the XDocument.Parse() call:

enter image description here

Regardless of which of the three types of calls to "Select(GetVendorForXMLElement)" I use, the NRE occurs. Is it the angle brackets in the CompanyName element ("[blank]")? Or...???


Solution

  • Your element has a VendorId element, not a VendorID element (notice the casing), Element("VendorID") therefore returns null, and calling Value on that throws an NRE.