C# проверяют, что элемент существует при использовании LINQ для XML

Хорошо, бит случайного вопроса, но лучший способ сделать это должно просто добавить код, Вы сможете видеть то, что я немедленно имею в виду:

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();

Это придумывает пустую ошибку - я должен был бы добавить элемент "Супертипа" к каждому клиенту перед нею с нулевым значением или являюсь там обходным решением, которое означало бы, что я не должен делать этого?

Удачи!

9
задан David Archer 13 April 2010 в 14:14
поделиться

5 ответов

Попробуйте следующее:

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();
13
ответ дан 4 December 2019 в 09:36
поделиться

У вас должна быть возможность просто добавить проверку на null

where c.Element("SuperType") != null 
&& [your other criteria]
6
ответ дан 4 December 2019 в 09:36
поделиться

Пробовали ли вы проверить, существует ли элемент SuperType, прежде чем пытаться прочитать значение из него?

...
where (c.Element("SuperType") != null && c.Element("SuperType").Value == "1")
...
3
ответ дан 4 December 2019 в 09:36
поделиться

Я бы сделал это так:

var superType = linquee.Descendants("customer").
    Where(c => c.Element("SuperType") != null 
        && c.Element("SuperType").Value == "1");
0
ответ дан 4 December 2019 в 09:36
поделиться

Также должна быть возможность очищать подобные вещи с помощью расширений, вроде ..

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();
0
ответ дан 4 December 2019 в 09:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: