OpenXML转义非法字符

时间:2015-03-29 01:16:02

标签: c# openxml-sdk

我正在使用OpenXML Power Tools在Word Docx文件中进行一些字符串替换,并且它正在按预期工作。但是当我在替换中包含无效字符时会出现问题,例如&符号,例如" Harry&萨利"将破坏并产生无效的文件。根据{{​​3}}非法字符需要转换为xHHHH。

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

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

1 个答案:

答案 0 :(得分:4)

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

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

  

&符号(&)和左尖括号(<)不得以其文字形式出现,除非用作标记分隔符,或用于注释,处理指令或CDATA部分。如果在其他地方需要它们,则必须分别使用数字字符引用或字符串" & "" < "进行转义。可以使用字符串" > "来表示右尖括号(>),并且为了兼容性,当它出现在字符串" > "中时,必须使用" ]]> "或字符引用进行转义。在内容中,当该字符串未标记CDATA部分的结尾时。

     

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

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

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

通常,您不会将这些编码为xHHHH,您可以使用上面列出的XML实体,但要么允许这两种实体。在每种情况下,你也不需要 来编码引号或直角括号,只有当它们代表XML语法时,它们通常更安全。时间。

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

  

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

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

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