2012-01-08 99 views
1
<root> 
    <data name="ID1"></data> 
    <data name="ID2"></data> 
</root> 
XDocument xmlDoc = XDocument.Load(xmlFile); 

bool exists = (from elem in xmlDoc.Descendants("root") 
       where elem.Element("data").Attribute("name").Value == "ID1" 
       select elem).Any(); 

它没有看到ID1已经存在。我究竟做错了什么?检查是否在名称属性存在价值

+0

什么是'XMLDoc'类型?它是'XDocument'还是它是'XElement'?这是你的实际XML吗?它不是有效的XML('data'节点没有关闭)。 – 2012-01-08 06:00:56

+0

这只是一个XML片段。 – Rod 2012-01-08 06:06:48

回答

4

根据您所展示的内容,首先我必须指出XML片段不是有效的XML。 data节点未关闭。

假设这是一个有效的XML文档,它最终将取决于变量XMLDoc的类型。

如果这是一个XDocument,那么该代码片段应该工作,并且exists的值将是true。该文件包含一个名为root的后代,它可能涉及其业务。

另一方面,如果这是一个XElement,那么该代码段应该失败,并且exists的值将是falseXMLDoc变量已经指的是root元素,显然没有任何后裔称为root

你应该然而,重写查询,也许更多的东西是这样的:

// please follow .NET naming conventions and use lowercase for local variables 
XDocument xmlDoc = XDocument.Load(xmlFile); 

// iterate over the `data` elements, not the `root` elements 
bool exists = (from data in xmlDoc.Element("root").Elements("data") 
       where (string)data.Attribute("name") == "ID1" 
       select data).Any(); 
// using the cast is a personal style choice 
// using `XAttribute.Value` is fine too in this case 
+0

所以你的工作。为什么不开采工作?顺便说一句,谢谢你的洞察力! – Rod 2012-01-08 06:18:07

+1

我认为你的代码会造成什么结果是你正在迭代'root'元素而不是'data'元素,这就是为什么我建议重写的原因。你的代码只会检查第一个'data'元素而忽略其余的元素。你的XML可能有不同的顺序,这可以解释为什么它失败。 – 2012-01-08 06:20:43