我有一个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节点的多个子节点是否文档中存在(为了进行验证,以避免插入重复数据)。
在一个潜在的解决方案有什么建议?
编辑:元件将相对于输入字符串。 例如,如果(inputNumber == xmlDocNumber){//不要插入新元素}
我会建议一个稍微不同的策略来使用Count()
-使用Any()
其优点是,任何()可以,因为它得到任何比赛都就立即停止:
var smsWithNoNumber = main.Descendants("SMS")
.Where(x => !x.Elements("Number").Any());
在这种情况下,它不会有太大胜算,但在情况下, Count()
可能需要数百万的点击量只是告诉你,有至少一个,这是一个有用的技巧就知道了。 我会说这也是你的意思更清晰的指示。
假设你有你的一些规范化形式的号码和你的XML被加载到一个XmlDocument
或一些这样的,最简单的非LINQ的方式来做到这一点是与XPath查询:
string pattern = String.Format("/Database/SMS/Number[. = '{0}']", number);
if (myDoc.SelectSingleNode(pattern) != null)
{
// number already exists in document
}
您可以申请由通过SMS节点的循环,但不包括转换数据的XSL文件的任何具有重复号码/文()值
检查将是这样的:
<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>