虽然这个主题有很多答案,但我找不到一个适用于我的案例。 该应用程序打开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);
答案 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"
,然后您就可以了。