使用LINQ to XML时,C#检查元素是否存在

时间:2010-04-13 14:14:02

标签: c# xml linq linq-to-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();

这会出现一个空错误 - 我是否需要在每个客户之前使用空值添加“SuperType”元素,或者是否有解决方法意味着我不必这样做?

干杯!

6 个答案:

答案 0 :(得分:13)

试试这个:

var superType = (from c in from c in linquee.Descendants("customer")
                 where (string) c.Element("SuperType") == "1"
                 select c).ToList();

基本上,如果您对XElement投射空string引用,您将获得一个空引用(您可以将其与“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();

答案 1 :(得分:6)

您应该只需添加一个空格检查

where c.Element("SuperType") != null 
&& [your other criteria]

答案 2 :(得分:3)

在尝试从中读取值之前,您是否尝试检查SuperType元素是否存在?

...
where (c.Element("SuperType") != null && c.Element("SuperType").Value == "1")
...

答案 3 :(得分:0)

我会这样做:

var superType = linquee.Descendants("customer").
    Where(c => c.Element("SuperType") != null 
        && c.Element("SuperType").Value == "1");

答案 4 :(得分:0)

还应该能够使用扩展程序来清理这类内容,例如......

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

答案 5 :(得分:0)

我找到了一个很好的解决方案,将Any()与条件运算符结合使用:

result = entry.Elements(ArbitraryElement).Any() ? (entry.Element(ArbitraryElement).Attributes(ArbitraryAttribute).Any() ? entry.Element(ArbitraryElement).Attribute(ArbitraryAttribute).Value : "-1") : "-1"

诀窍是使用Elements()和Any()来检查元素是否存在(Attributes()相同)

因此对于这个例子,它将是这样的:

var superType = from c in linquee.Descendants("customer")  
                select c.Elements("SuperType").Any() ? c.Element("SuperType").Value : "0";