Выберите Xml Node, используя Linq to XML
Мой XML-файл:
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfCustomer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Customer>
<CustomerId>1f323c97-2015-4a3d-9956-a93115c272ea</CustomerId>
<FirstName>Aria</FirstName>
<LastName>Stark</LastName>
<DOB>1999-01-01T00:00:00</DOB>
</Customer>
<Customer>
<CustomerId>c9c326c2-1e27-440b-9b25-c79b1d9c80ed</CustomerId>
<FirstName>John</FirstName>
<LastName>Snow</LastName>
<DOB>1983-01-01T00:00:00</DOB>
</Customer>
</ArrayOfCustomer>
моя попытка:
XElement toEdit =
(XElement)doc.Descendants("ArrayOfCustomer")
.Descendants("Customer")
.Where(x => Guid.Parse((x.Descendants("CustomerId") as XElement).Value) == customer.CustomerId)
.First<XElement>();
это вызывает следующее исключение:
Object reference not set to an instance of an object.
1) не x
XElement
?
2) это правильная лямбда для выбора узла Xml?
3) и, конечно, как вы найдете этот узел в соответствии с CustomerId
?
4 ответа
Решение
Ваша проблема в том, что Descendents
а также Where
вернуть IEnumerable<XElement>
ни одного XElement
это то, что вы после. Вы можете исправить это так:
XElement toEdit = doc.Descendants("ArrayOfCustomer")
.Descendants("Customer")
.Where(x => Guid.Parse(x.Descendants("CustomerId").Single().Value) == customer.CustomerId)
.FirstOrDefault();
Вы не кастинг x
вы кастуете x.Descendants()
, x.Descendants() возвращает коллекцию, следовательно, метод множественного числа семантический. Вне моей головы вы должны быть в состоянии сделать x.Descendants("CustomerId").FirstOrDefault() as XElement
Я бы перестроил ваш запрос следующим образом:
XElement toEdit = doc.Descendants("Customer")
.Where(x => (Guid)x.Element("CustomerId") == customer.CustomerId)
.FirstOrDefault();
XElement toEdit = (from c in doc.Descendants("Customer")
where Guid.Parse(c.Value) == customer.CustomerId
select c).SingleOrDefault();