替换字符串中的一些字符(XML格式)

时间:2016-10-04 05:12:52

标签: c# xml

我获得了一个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;

韩国社交协会

2 个答案:

答案 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只关注&amp;&gt;&lt;&quot;&apos;,所有其他值应作为原始/原生字符在文档中。

答案 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。