1

我有一个 xml 字符串,我将其设置为正文并将该 xml 转换为所需的。XML 字符串:

XML_STRING= "<A><B>abc</B><C>abc&ade</C></A>";

什么时候

<set-body>@((String)context.Variables["XML_STRING"])</set-body>
<xsl-transform>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" />
<xsl:template match="/">
<xsl:copy-of select="A" />
</xsl:template>
</xsl:stylesheet>
</xsl-transform>

我收到以下错误:

xsl-transform (0.398 ms)
    {
    "messages": [
        null,
        "Invalid Xml passed to transform: ' ' is an unexpected token. The expected token is ';'. Line 1, position 2612.",
        "' ' is an unexpected token. The expected token is ';'. Line 1, position 2612."
    ]
}

当我将“&”从 xml_string 更改为 & 时,它工作正常。但我想知道我们如何使用代码替换它。

4

1 回答 1

0

如果您的字符串不是有效的 XML,它将不会被解析。如果它本身包含一个 & 符号,则它不是有效的 XML。与 HTML 不同,XML 非常严格。

理想情况下,XML 在您的代码使用它之前被正确转义。如果这超出了您的控制范围,您可以编写一个正则表达式。

Regex.Replace可以为您提供更多控制以避免这种情况,并且可以编写为仅匹配不属于其他字符的“&”符号,例如&lt;,类似:

string result = Regex.Replace(test, "&(?!(amp|apos|quot|lt|gt);)", "&amp;");

但,

HtmlEncode 不能解决问题,它可能会创建更多的 & 符号(例如,一个 ' 可能会变成 ",这是一个 Xml 实体引用,如下所示:

&amp;   & 
&apos;  ' 
&quot;  " 
&lt;    < 
&gt;    > 

但是你可能会得到像   这样的东西,这在 html 中很好,但在 Xml 中不行。如果包含非法字符的文本是 xml 节点内的文本,您可以采取简单的方法并用 CDATA 元素包围文本,但这不适用于属性。

如果您可以控制 xml 文件的创建,并且需要替换单个字符,那么此代码对您有帮助:

string.Replace("&", "&amp;").Replace("'", "&quot;").etc.etc.
于 2021-09-23T09:26:40.337 回答