我有一个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){//不插入新元素}
答案 0 :(得分:42)
我建议使用Count()
略有不同 - 使用Any()
。优点是Any()可以在任何匹配时立即停止:
var smsWithNoNumber = main.Descendants("SMS")
.Where(x => !x.Elements("Number").Any());
在这种情况下它不会有太大的可能性,但是如果Count()
可能需要计算一百万次点击只是为了告诉你至少有一次,这是一个有用的技巧。我会说这也是你所说的更明确的指标。
答案 1 :(得分:1)
假设您的数字是某种规范化形式,并且您的XML被加载到XmlDocument
或其他类似的,最简单的非LINQ方法是使用XPath查询:
string pattern = String.Format("/Database/SMS/Number[. = '{0}']", number);
if (myDoc.SelectSingleNode(pattern) != null)
{
// number already exists in document
}
答案 2 :(得分:0)
您可以应用一个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>