我获得了一个String变量,其中包含以下内容:
<main>
<Title title="Hello World" />
<Content content="bla bla bla... by <1% to ??? on other bla bla...." />
</main>
此字符串最终将传递给XQuery的存储过程。
正如您所看到的,内容&#34;内容&#34;包含char &#34;&lt;&#34; ,当我尝试在存储过程中解析时,它会返回错误。
我的问题是如何将&#34;&lt;&#34; 转换为&amp; lt; (在这种情况下&lt; 1% 以高效的方式&amp; lt; 1%。
我希望保留其他&#34;&lt;&#34; 。
韩国社交协会
答案 0 :(得分:1)
由于您更新了问题以指出您正在处理XML,但未编码的值位于属性值中,而不是#text
个节点,因此它使其更简单,只需使用类似的方法提取属性值到我之前的答案,然后使用库函数授权它,然后输出。
请注意,CDATA仅适用于#text
,而不适用于属性。
String doc =
@"<main>
<Title title=""Hello World"" />
<Content content=""bla bla bla... by <1% to ??? on other bla bla...."" />
</main>";
Int32 contentOpenStart = doc.IndexOf("<Content");
Int32 contentAttribContentValueStart = doc.IndexOf("content=\"", contentOpenStart) + "content=\"".Length;
Int32 contentAttibContentValueEnd = doc.IndexOf("\"", contentAttribContentValueStart);
String attributeValueOld = doc.Substring( contentAttribContentValueStart, contentAttibContentValueEnd );
String attributeValueNew = System.Net.WebUtility.HtmlEncode( attributeValueOld );
String doc2 = String.Concat(
doc.Substring( 0, contentAttribContentValueStart );
attributeValueNew,
doc.Substring( contentAttibContentValueEnd );
);
然后 doc2
包含固定的属性值。
请注意,使用HtmlEncode
执行实体的HTML编码在XML中并不严格正确,因为XML实体集比HTML小得多 - 实际上,XML只关注&
, >
,<
,"
和'
,所有其他值应作为原始/原生字符在文档中。
答案 1 :(得分:0)
(这个答案是基于你正在处理结构正确的XML的假设,只是在#text
个节点中使用未编码的实体 - 如果你的输入数据确实看起来像<Title="foo" />
那么这个答案不适用 - 根本不是XML)
如果我正确理解您的问题,您在String
实例中有一个XML文档,其中包含不正确的转义/授权特殊字符,这会阻止您使用普通的XML解析器来读取文档。
如果您正在处理符合XML的系统,那么您可以使用<![DATA[
然后不需要尝试处理<Content>
元素的内容,然后技巧就会插入CDATA分隔符。
虽然人们经常说不能使用正则表达式解析XML(因为XML不是Regular Language),但您可以利用XML的语法规则来提取和识别标记。
所以如果你有这个:
<Content someAttribute="someValue">
reduce sales by <1% in order to ensure that profit > loss
</Content>
然后你可以这样做:
String doc = @"<main><Title...";
Int32 contentOpenStart = doc.IndexOf("<Content");
Int32 contentOpenEnd = doc.IndexOf(">", contentOpenStart);
Int32 contentCloseStart = doc.IndexOf("</Content>", contentOpenEnd);
然后,此代码告诉我们<Content>
元素的两个标记的尖括号的位置,我们可以使用它来插入CDATA分隔符:
String newDocument = String.Concat(
doc.Substring( 0, contentOpenEnd + 1 ), // "<main>...<Content...>"
"<![CDATA[",
doc.Substring( contentOpenEnd + 1, contentCloseStart ),
"]]>",
doc.Substring( contentCloseStart ) "</Content>..."
);
newDocument
将是这样的:
<Content someAttribute="someValue"><![CDATA[
reduce sales by <1% in order to ensure that profit > loss
]]></Content>
...这是有效的XML。