【问题标题】: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 文档中的任何指定元素......。除了我所拥有的,我还能给你什么?

标签: c# xml linq linq-to-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#
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
相关资源
最近更新 更多