【问题标题】:OpenXML escaping illegal charactersOpenXML 转义非法字符
【发布时间】:2022-02-11 08:42:02
【问题描述】:

我正在使用OpenXML Power Tools 在 Word Docx 文件中进行一些字符串替换,它按预期工作。但是,当我在替换中使用无效字符(例如 & 符号)时,事情就会中断,因此例如“Harry & Sally”会中断并生成无效文档。根据this post非法字符需要转换为xHHHH。

我无法找到帖子中提到的 OOXML 子句的内容,因此无法正确转义字符。

我希望有人对需要转义的字符有一些代码或见解。我也希望 OpenXML Power Tools 能以某种方式为我做这件事,但我似乎也找不到任何东西。

【问题讨论】:

  • 如果某些事情没有按预期工作,您可能需要显示一些代码。请将此代码段添加到您的问题中。

标签: c# openxml-sdk


【解决方案1】:

规范只是在讨论必须在 XML 中转义的标准字符集。链接帖子中提到的 XML 规范来自 W3C,found here。

有五个字符需要在它们出现在 XML 数据(名称、值等)中的任何位置进行转义,除非它们是 CDATA 部分的一部分。根据第 2.4 节:

& 符号 (&) 和左尖括号 (" & " 和" < " 对其进行转义。右尖括号 (>) 可以使用字符串 " > " 表示,并且为了兼容性,当它出现在内容中的字符串 " ]]> " 中时,必须使用 " > " 或字符引用进行转义,当该字符串是不标记 CDATA 部分的结尾。

为了允许属性值同时包含单引号和双引号,撇号或单引号字符 (') 可以表示为 " ' ",而双引号字符 (") 可以表示为 " " "。

换句话说,转义以下字符:

' -> '
" -> "
> -> >
< -> &lt;
& -> &amp;

通常,您不会将这些编码为 xHHHH,您会使用上面列出的 XML 实体,但任何一种都是允许的。您也不需要需要在每种情况下都对引号或直角括号进行编码,只有在它们可以表示 XML 语法时才进行编码,但始终这样做通常更安全。

XML 规范还包括可以出现在 XML 文档中的每个 Unicode 字符的列表,在第 2.2 节中:

字符 ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

该列表基本上包括基本平面中的每个 Unicode 字符(您可能遇到的每个字符),控制字符除外。只允许使用制表符、CR 和 LF 字符——任何低于 ASCII 32(空格)的其他字符都需要转义。

列表中的最大差距 (0xD800-0xDFF) 是代理编码值,无论如何它们都不应该单独出现,因为它们不是有效字符。最后两个 0xFFFE 和 0xFFFF 也是无效字符。

【讨论】:

  • 您可能需要为撇号和引号添加缺少的分号
  • @TheEdge 我已经添加了它们
【解决方案2】:

我在 Michael Edenfield 的回答的帮助下创建了一个扩展方法。非常不言自明...请确保先替换&符号!否则您最终会错误地替换其他转义符号。

public static string EscapeXmlCharacters(this string input)
{
    switch (input)
    {
        case null: return null;
        case "": return "";
        default:
        {
            input = input.Replace("&", "&amp;")
                .Replace("'", "&apos;")
                .Replace("\"", "&quot;")
                .Replace(">", "&gt;")
                .Replace("<", "&lt;");

            return input;
        }
    }
}

.NET 小提琴:https://dotnetfiddle.net/PCqffy

【讨论】:

    猜你喜欢
    • 2011-09-09
    • 2012-09-14
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2012-03-20
    相关资源
    最近更新 更多