检查name属性中是否存在值

时间:2012-01-08 05:52:41

标签: c# xml linq-to-xml

<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已经存在。我做错了什么?

1 个答案:

答案 0 :(得分: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