我正试图解决我在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的用户是否有电话号码。
有人建议一个解决方案,正如我所说,似乎应该很简单......
干杯, 奥拉
答案 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数据一起使用,因为它不会创建带有空数据的标记
为此你必须循环遍历子元素