Хорошо, бит случайного вопроса, но лучший способ сделать это должно просто добавить код, Вы сможете видеть то, что я немедленно имею в виду:
XML:
<?xml version="1.0" encoding="utf-8" ?>
<customers>
<customer>
<id>1</id>
<name>Blah-face</name>
<Type>1</Type>
</customer>
<customer>
<id>2</id>
<name>Blah-face-2</name>
<Type>2</Type>
</customer>
<customer>
<id>3</id>
<name>Blah-face-3</name>
<Type>1</Type>
<SuperType>1</SuperType>
</customer>
</customers>
C#:
XDocument linquee = XDocument.Load(path);
var superType = (from c in linquee.Descendants("customer")
where (c.Element("SuperType").Value == "1")
select c).ToList();
Это придумывает пустую ошибку - я должен был бы добавить элемент "Супертипа" к каждому клиенту перед нею с нулевым значением или являюсь там обходным решением, которое означало бы, что я не должен делать этого?
Удачи!
Попробуйте следующее:
var superType = (from c in from c in linquee.Descendants("customer")
where (string) c.Element("SuperType") == "1"
select c).ToList();
Обычно, если вы приводите нулевую ссылку XElement
к строке
, вы ' я получу пустую ссылку (которую можно сравнить с "1").
Альтернативой может быть приведение к int?
, который (IIRC) вернет значение null int?
, если элемент отсутствует, но взорвать, если он присутствует, но не числовой:
var superType = (from c in from c in linquee.Descendants("customer")
where (int?) c.Element("SuperType") == 1
select c).ToList();
У вас должна быть возможность просто добавить проверку на null
where c.Element("SuperType") != null
&& [your other criteria]
Пробовали ли вы проверить, существует ли элемент SuperType
, прежде чем пытаться прочитать значение из него?
...
where (c.Element("SuperType") != null && c.Element("SuperType").Value == "1")
...
Я бы сделал это так:
var superType = linquee.Descendants("customer").
Where(c => c.Element("SuperType") != null
&& c.Element("SuperType").Value == "1");
Также должна быть возможность очищать подобные вещи с помощью расширений, вроде ..
public string Element_valStr(XElement xElm, string xName)
{
if (xElm.Element(xName) == null) return string.empty;
return xElm.Element(xName).Value;
}
, а затем просто:
var superType = (from c in linquee.Descendants("customer")
where (c.Element_valStr("SuperType") == "1")
select c).ToList();