如何使用linq检查xml文件中是否已存在值

时间:2015-04-08 17:42:43

标签: c# xml linq

虽然这个主题有很多答案,但我找不到一个适用于我的案例。 该应用程序打开xml文件以从列表中添加新条目,但防止重复。如果项目已经在xml中,我不知道如何检查(使用Linq)

<!-- XML File sample -->
<?xml version="1.0" encoding="UTF-8"?>
<Items>
 <Item>
    <Text>AUDI</Text>
  </Item>
<Item>
  <Text>BMW</Text>
</Item>
</Items>

这是代码。 (为简单起见,我省略了修剪,大写等) 问题出在结果var中,它总是返回false。

XDocument doc = XDocument.Load(@filePath);
for (int i = 0; i < items.Count; i++)
  {
     var result = doc.Descendants("Item").Any(x => x.Element("Text").ToString().Equals(items[i]);

     if (! result)
          {

          }

doc.Save(@filePath);

2 个答案:

答案 0 :(得分:2)

你的问题是:

x.Element("Text").ToString()

要使Text节点内的字符串使用.Value

像这样:

XDocument doc = XDocument.Load(@filePath);
for (int i = 0; i < items.Count; i++)
{
    var result = doc.Descendants("Item").Any(x => x.Element("Text").Value.Equals(items[i]));

    if (!result)
    {

    }
}

doc.Save(@filePath);

答案 1 :(得分:2)

我相信您错误地解释了XML的格式..您希望匹配InnerXml元素的Text,而您在此处从不这样做。所以你需要从Root移动 - &gt;项目 - &gt;项目 - &gt;文字 - &gt;价值并不完全与您的代码相关。

因此,您至少需要在Value元素(Text)上使用x.Element("Text").Value引用。另外,我认为您对Descendants的调用会直接返回Text元素,因此我建议在此之后检查IEnum并确认您在此时处于什么级别的xml。我还没有使用过这种方法,但我的理解是它为你提供了你提供的xpath的后代,这意味着它为你提供了Text元素。如果是这种情况,请将该字符串更改为"Items",然后您就可以了。