I'm pulling the values from the following XML based on the attribute name.
<DataRow>
<DataItem name="SYMBOL">MSFT-US</DataItem>
<DataItem name="NAME">Microsoft Corporation</DataItem>
<DataItem name="CUSIP">59491812311</DataItem>
<DataItem name="SEDOL">2588CFA</DataItem>
<DataItem name="CURRENCY">USD</DataItem>
<DataItem name="DATE">2018-10-05</DataItem>
<DataItem name="PRICE">100.25</DataItem>
</DataRow>
Here's my working code to select the values into a list:
IEnumerable<XElement> xDoc = XDocument.Parse(xmlString).Descendants("DataRow");
var query = from item in xDoc
let symbol = (item.Elements("DataItem")
.Where(i => (string)i.Attribute("name") == "SYMBOL").Select(i => i.Value)).FirstOrDefault()
let compName = (item.Elements("DataItem")
.Where(i => (string)i.Attribute("name") == "NAME").Select(i => i.Value)).FirstOrDefault()
let cusip = (item.Elements("DataItem")
.Where(i => (string)i.Attribute("name") == "CUSIP").Select(i => i.Value)).FirstOrDefault()
let sedol = (item.Elements("DataItem")
.Where(i => (string)i.Attribute("name") == "SEDOL").Select(i => i.Value)).FirstOrDefault()
select new {
Symbol = symbol,
CompName = compName,
Cusip = cusip,
Sedol = sedol
};
I feel that this can be made cleaner. How can it be done?