【问题标题】:How to check if a value already exists in an xml file using linq如何使用linq检查xml文件中是否已存在值
【发布时间】:2015-04-09 01:57:11
【问题描述】:

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

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

这是代码。 (为简单起见,我省略了修剪、大写等) 问题出在结果变量中,它总是返回 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);

【问题讨论】:

    标签: c# xml linq


    【解决方案1】:

    你的问题是:

    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);
    

    【讨论】:

      【解决方案2】:

      我相信您误解了 XML 的格式。您正在寻找匹配 Text 元素的 InnerXml ,而您在这里从未这样做过。因此,您需要从 Root -> Items -> Item -> Text -> Value 移动,这与您的代码不完全一样。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-24
        • 1970-01-01
        • 2021-03-18
        相关资源
        最近更新 更多