TL;DR-在.Net和XmlDocument/XDocument中,是否有一种简单的方法(XPath?)可以找到CDATA
节点,以便删除它们并对内容进行编码?
详细信息...
我的系统在很多情况下都需要手动构建XML字符串(例如字符串连接,而不是通过XmlDocument或XDocument构建),这些字符串可能包含多个<![CDATA[...]]>
节点(可能出现在结构的任何级别)...例如
<data><one><![CDATA[ab&cd]]></one><two><inner><![CDATA[xy<z]]></inner></two></data>
当在SQLServer XML列中存储此数据时,<![CDATA[..]]>
将自动删除,内部文本将被编码...这是不“执行”CDATA
的SQLServer的标准。
我的问题是,我有复杂的代码,需要一个类的两个示例,并审计跟踪它们之间的差异...一个或多个可能是包含XML的字符串属性。
这会导致不匹配(从而导致审计跟踪条目),而实际上什么都没有更改,因为代码创建一种格式的XML,而SQLServer返回一种不同的格式,例如..
// Manually generated XML string...
<data><one><![CDATA[ab&cd]]></one><two><inner><![CDATA[xy<z]]></inner></two></data>
// SQLServer returned string...
<data><one>ab&cd</one><two><inner>xy<z</inner></two></data>
在.Net中是否有一种简单的方法来处理手动生成的XML并将每个CDATA
节点转换为它的编码版本,以便我可以将该字符串与SQLServer返回的字符串进行比较?
有没有SelectNodes
XPath可以找到所有这些元素?
(And在任何人说明之前,显而易见的解决方案是首先不要在手动创建XML时使用CDATA
......但是,由于示例的数量太多,这是不可能的。)
1条答案
按热度按时间gstyhher1#
只需一个
foreach
线圈和ReplaceChild
:产出
另一种选择是使用XslCompiledTransform通过XSLT标识转换运行XML,例如: