我正在使用一些包含字符串的XML:
<node>This is a string</node>
我传递给节点的一些字符串将有&,#,$等字符:
<node>This is a string & so is this</node>
由于&,这是无效的。
我不能在CDATA中包装这些字符串,因为它们需要这样。我尝试寻找一个字符列表,这些字符不能放在XML节点中,而不能放在CDATA中。
有人能给我指个方向或者给我一份非法字符的列表吗?
我正在使用一些包含字符串的XML:
<node>This is a string</node>
我传递给节点的一些字符串将有&,#,$等字符:
<node>This is a string & so is this</node>
由于&,这是无效的。
我不能在CDATA中包装这些字符串,因为它们需要这样。我尝试寻找一个字符列表,这些字符不能放在XML节点中,而不能放在CDATA中。
有人能给我指个方向或者给我一份非法字符的列表吗?
当前回答
好的,让我们把角色的问题分开
在任何XML文档中都无效。 需要逃脱。
“https://stackoverflow.com/questions/730133/invalid-characters-in-xml/5110103#5110103”中@dolmen提供的答案仍然有效,但需要使用XML 1.1规范进行更新。
1. 无效字符
这里描述的字符是允许在XML文档中插入的所有字符。
1.1. 在XML 1.0中
参考:参见XML推荐1.0,§2.2字符
允许字符的全局列表是:
[2] Char::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /*任何Unicode字符,不包括代理块FFFE和FFFF。* /
基本上,控制字符和超出Unicode范围的字符是不允许的。 这也意味着调用字符实体是被禁止的。
1.2. XML 1.1中
参考:参见XML推荐1.1、§2.2字符和1.3 XML 1.1的基本原理和更改列表
允许字符的全局列表是:
[2] Char::= [#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /*任何Unicode字符,不包括代理块FFFE和FFFF。* /
(2a) RestrictedChar ::= [# 已发现x1 - x8] | [# - # xC] | [/ xE - x1F] | [/ x7F - x84] | [/ x86 - x9F]
XML建议的修订扩展了允许的字符,因此允许使用控制字符,并考虑到Unicode标准的新修订,但仍然不允许使用这些字符:NUL (x00)、xFFFE、xFFFF……
但是,不鼓励使用控制字符和未定义的Unicode字符。
还可以注意到,并非所有解析器都考虑到这一点,带有控制字符的XML文档可能会被拒绝。
2. 需要转义的字符(以获得格式良好的文档):
<必须用<转义;实体,因为它被假定为标记的开始。
&必须用&转义;实体,因为它被假定为实体引用的开始
>应该用>实体。它不是强制性的——它取决于上下文——但强烈建议避免使用它。
'应该用'Entity——在单引号内定义的属性中是强制的,但强烈建议总是转义它。
"应该用"Entity——在双引号中定义的属性中是强制的,但强烈建议总是转义它。
其他回答
除了potame的答案,如果你想转义使用CDATA块。
如果你把你的文本放在一个CDATA块,那么你不需要使用转义。 在这种情况下,您可以使用以下范围内的所有字符:
注意:除此之外,您不允许使用]]>字符序列。因为它将匹配CDATA块的末尾。
如果仍然存在无效字符(例如控制字符),那么可能最好使用某种编码(例如base64)。
好的,让我们把角色的问题分开
在任何XML文档中都无效。 需要逃脱。
“https://stackoverflow.com/questions/730133/invalid-characters-in-xml/5110103#5110103”中@dolmen提供的答案仍然有效,但需要使用XML 1.1规范进行更新。
1. 无效字符
这里描述的字符是允许在XML文档中插入的所有字符。
1.1. 在XML 1.0中
参考:参见XML推荐1.0,§2.2字符
允许字符的全局列表是:
[2] Char::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /*任何Unicode字符,不包括代理块FFFE和FFFF。* /
基本上,控制字符和超出Unicode范围的字符是不允许的。 这也意味着调用字符实体是被禁止的。
1.2. XML 1.1中
参考:参见XML推荐1.1、§2.2字符和1.3 XML 1.1的基本原理和更改列表
允许字符的全局列表是:
[2] Char::= [#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /*任何Unicode字符,不包括代理块FFFE和FFFF。* /
(2a) RestrictedChar ::= [# 已发现x1 - x8] | [# - # xC] | [/ xE - x1F] | [/ x7F - x84] | [/ x86 - x9F]
XML建议的修订扩展了允许的字符,因此允许使用控制字符,并考虑到Unicode标准的新修订,但仍然不允许使用这些字符:NUL (x00)、xFFFE、xFFFF……
但是,不鼓励使用控制字符和未定义的Unicode字符。
还可以注意到,并非所有解析器都考虑到这一点,带有控制字符的XML文档可能会被拒绝。
2. 需要转义的字符(以获得格式良好的文档):
<必须用<转义;实体,因为它被假定为标记的开始。
&必须用&转义;实体,因为它被假定为实体引用的开始
>应该用>实体。它不是强制性的——它取决于上下文——但强烈建议避免使用它。
'应该用'Entity——在单引号内定义的属性中是强制的,但强烈建议总是转义它。
"应该用"Entity——在双引号中定义的属性中是强制的,但强烈建议总是转义它。
在Woodstox XML处理器中,无效字符由以下代码分类:
if (c == 0) {
throw new IOException("Invalid null character in text to output");
}
if (c < ' ' || (c >= 0x7F && c <= 0x9F)) {
String msg = "Invalid white space character (0x" + Integer.toHexString(c) + ") in text to output";
if (mXml11) {
msg += " (can only be output using character entity)";
}
throw new IOException(msg);
}
if (c > 0x10FFFF) {
throw new IOException("Illegal unicode character point (0x" + Integer.toHexString(c) + ") to output; max is 0x10FFFF as per RFC");
}
/*
* Surrogate pair in non-quotable (not text or attribute value) content, and non-unicode encoding (ISO-8859-x,
* Ascii)?
*/
if (c >= SURR1_FIRST && c <= SURR2_LAST) {
throw new IOException("Illegal surrogate pair -- can only be output via character entities, which are not allowed in this content");
}
throw new IOException("Invalid XML character (0x"+Integer.toHexString(c)+") in text to output");
来自这里
有人尝试过这个system . security . securityelelement . escape (yourstring)吗? 这将用有效的等效字符替换字符串中的无效XML字符。
对于XSL(在非常懒惰的日子里),我使用:
capture="&(?!amp;)" capturereplace="&amp;"
翻译所有没有遵循的&符号på amp;敬合适的人。
在某些情况下,输入是CDATA,但是使用XML的系统没有考虑到它。这是一个草率的修复,小心…