C# Linq to XML 检查元素是不是存在

Posted

技术标签:

【中文标题】C# Linq to XML 检查元素是不是存在【英文标题】:C# Linq to XML check if element existsC# Linq to XML 检查元素是否存在 【发布时间】:2009-06-24 16:59:08 【问题描述】:

我有一个如下的 XML 文档:

<Database>
 <SMS>
   <Number>"+447528349828"</Number> 
   <Date>"09/06/24</Date> 
   <Time>13:35:01"</Time> 
   <Message>"Stop"</Message> 
 </SMS>
 <SMS>
   <Number>"+447528349828"</Number> 
   <Date>"09/06/24</Date> 
   <Time>13:35:01"</Time> 
   <Message>"Stop"</Message> 
 </SMS>
</Database>

我正在尝试检查文档中是否存在父 SMS 节点的 number 子节点(用于验证目的以避免插入重复数据)。

对潜在解决方案有何建议?

编辑: 该元素将与输入字符串进行比较。例如 if(inputNumber == xmlDocNumber) //不要插入新元素

【问题讨论】:

您能否给我们一些示例(伪?)代码,以提供您需要的上下文和更清晰的图片> 示例代码将如何帮助............找到 xml 文档中的任何指定元素......。除了我所拥有的,我还能给你什么? 【参考方案1】:

我会建议与使用 Count() 略有不同的方法 - 使用 Any()。优点是 Any() 可以在得到任何匹配项后立即停止:

var smsWithNoNumber = main.Descendants("SMS")
                          .Where(x => !x.Elements("Number").Any());

在这种情况下,它不会产生太大的可能性,但在 Count() 可能不得不计算一百万次点击以告诉您至少有一个点击的情况下,这是一个有用的技巧。我想说这也更清楚地表明了你的意思。

【讨论】:

如何使用它进行检查?抱歉,我还在熟悉 LINQ @Blackator:Any 部分正在进行检查。我不知道你面临什么问题,所以很难更准确。也许你应该问一个新问题? 请检查我的问题here。谢谢乔恩【参考方案2】:

假设您的号码采用某种规范化形式,并且您的 XML 被加载到 XmlDocument 或类似的文件中,最简单的非 LINQ 方法是使用 XPath 查询:

string pattern = String.Format("/Database/SMS/Number[. = '0']", number);
if (myDoc.SelectSingleNode(pattern) != null)

   // number already exists in document

【讨论】:

问题是使用 Linq to XML【参考方案3】:

您可以应用 XSL 文档,通过遍历 SMS 节点并排除任何具有重复 Number/text() 值的数据来转换数据

检查类似于:

<xsl:template match="SMS">
<xsl:variable name="parentNode" select="." />
<xsl:if test="preceding-sibling::SMS/Number/text()=$parentNode/Number/text()">
.....include a copy of node......
</xsl:if>
  </xsl:template>

【讨论】:

问题是使用 Linq to XML#

以上是关于C# Linq to XML 检查元素是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

检查 XML 节点是不是具有 Linq C# 的属性?

C# LINQ-to-XML 选择子元素属性最大的元素

Linq to Xml C#在特定元素中查找特定元素

c# LINQ-to-XML 更新(保存)排序后文件中的元素列表

LINQ to XML:如何在 C# 中获取元素值?

在 C# 中使用 Linq to XML 在文档中搜索不同的 XML 结构