检查Linq to XML是否存在XML子元素

时间:2009-07-28 08:46:14

标签: xml linq linq-to-xml

我正试图解决我在Linq中遇到的问题,看起来应该很简单,但即使在这里浏览了Linq to XML问题之后,我也无法理解它。 / p>

采取以下XML的内容:

<users>
    <user id="1">
        <contactDetails>
            <phone number="555 555 555" />
        </contactDetails>
    </user>
    <user id="2">
        <contactDetails />
    </user>
</users>

我现在想检查ID为2的用户是否有电话号码。

有人建议一个解决方案,正如我所说,似乎应该很简单......

干杯, 奥拉

3 个答案:

答案 0 :(得分:13)

这是一种查询方法:

XElement yourDoc = XElement.Load("your file name.xml");

bool hasPhone = (
    from user in yourDoc.Descendants("user")
    where (int)user.Attribute("id") == 2
    select user.Descendants("phone").Any()
    ).Single();

答案 1 :(得分:3)

这可能是一种更好,更流畅的方式(我还不太熟悉Linq-to-XML),但这段代码应该可以工作:

XElement yourDoc = XElement.Load("your file name.xml");

foreach (XElement user in yourDoc.Descendants("user"))
{
    foreach(XElement contact in user.Descendants("contactDetails"))
    {
       var phone = contact.Descendants("phone");

       bool hasPhone = (phone.Count() > 0);
    }
}

它基本上枚举了XML中的所有“用户”节点,然后是用户节点内的所有“contactDetails”节点,然后检查其下是否有“电话”子节点。

.Descendants()调用将返回一个XElement节点列表,如果没有您查询的类型,该列表上的.Count()IEnumerable<T>)将返回0 - 这就是我的代码正在检查的内容。

马克

答案 2 :(得分:1)

在Linq to xml中,您可以在获取值之前快速检查:

if (!xe.Root.Element("Date").IsEmpty)
{
    pd.datefield = System.Convert.ToString(xe.Root.Element("Date").Value);
}

不能与数据库中的NULL数据一起使用,因为它不会创建带有空数据的标记

为此你必须循环遍历子元素