ColdFusion:无效的XML控件字符(十六进制)

ColdFusion:无效的XML控件字符(十六进制),xml,coldfusion,char,hex,Xml,Coldfusion,Char,Hex,我正在尝试使用创建一个xml对象。我用XMLFormat()格式化了所有数据。 在XML中有一些无效字符,如“»”。我将此字符添加到xml doctype中,如下所示: <!ENTITY raquo "»"> HTML文本的格式不是很好,但大部分都可以与我的代码一起使用。但在一些文本中有一些控制字符。我得到以下错误: 在文档的元素内容中发现无效的XML字符(Unicode:0x13) 我尝试将unicode添加到doctype中,并尝试了这个方法。两者都不起作用…试着使用

我正在尝试使用
创建一个xml对象。我用
XMLFormat()
格式化了所有数据。 在XML中有一些无效字符,如“»”。我将此字符添加到xml doctype中,如下所示:

<!ENTITY raquo "»">

HTML文本的格式不是很好,但大部分都可以与我的代码一起使用。但在一些文本中有一些控制字符。我得到以下错误:

在文档的元素内容中发现无效的XML字符(Unicode:0x13)

我尝试将unicode添加到doctype中,并尝试了这个方法。两者都不起作用…

试着使用
»而不是
»
。例如,此CFML:

<cfxml variable="x"><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE doc
[
    <!ENTITY raquo "&#187;">
]>
<doc>
    Hello, &raquo; !
</doc>
</cfxml>

<cfdump var="#x#">

您好!

通过此方法传递XML字符串,这将解决您的问题

它只允许在输入中发送有效字符,如果您想用其他字符替换无效字符,可以修改下面的方法

public String stripNonValidXMLCharacters(String in) {
    StringBuffer out = new StringBuffer(); // Used to hold the output.
    char current; // Used to reference the current character.

    if (in == null || ("".equals(in))) return ""; // vacancy test.
    for (int i = 0; i < in.length(); i++) {
        current = in.charAt(i);
        if ((current == 0x9) ||
            (current == 0xA) ||
            (current == 0xD) ||
            ((current >= 0x20) && (current <= 0xD7FF)) ||
            ((current >= 0xE000) && (current <= 0xFFFD)) ||
            ((current >= 0x10000) && (current <= 0x10FFFF)))
            out.append(current);
    }
    return out.toString();
}  
public String stripNonValidXML字符(字符串输入){
StringBuffer out=new StringBuffer();//用于保存输出。
char current;//用于引用当前字符。
if(in==null | |(“”.equals(in)))返回“”;//空缺测试。
对于(int i=0;i((current>=0x20)&&&(current=0xE000)&(current=0x10000)&&(current下面是清理XML的有效cfscript代码,有两种方法,一种清除较高的国际字符,另一种只清除破坏XML的较低ASCII字符,如果找到更多字符,只需扩展筛选规则

<cfscript>    
    function cleanHighAscii(text){
        var buffer = createObject("java", "java.lang.StringBuffer").init();
        var pattern = createObject("java", "java.util.regex.Pattern").compile(javaCast( "string", "[^\x00-\x7F]" ));
        var matcher = pattern.Matcher(javaCast( "string", text));

        while(matcher.find()){
            var value = matcher.group();
            var asciiValue = asc(value);

            if ((asciiValue == 8220) OR (asciiValue == 8221))
                value = """";
            else if ((asciiValue == 8216) || (asciiValue == 8217))
                value = "'";
            else if (asciiValue == 8230)
                value = "...";
            else
                value = "&###asciiValue#;";

            matcher.AppendReplacement(buffer, javaCast( "string", value ));
        }

        matcher.AppendTail(buffer);
        return buffer.ToString();
    }

    function removeSubAscii(text){

        return rereplaceNoCase(text, "\x1A","&###26#;", "all");
    }

    function XMLSafe(text){
        text = cleanHighAscii(text);
        text = removeSubAscii(text);
        return text;
    }
</cfscript>

您误解了我的问题。
>
只是一个示例(有效)。我需要的是0x13的代码…例如,看起来像 的东西(如果存在的话)…我同意,这不是CF,而是JAVA中的工作解决方案:)XMLFormat只进行最小的清理,因此最终必须使用find或regex过滤掉所有奇怪的ASCII字符,通过循环进行衰减。
var esapi = createObject("java", "org.owasp.esapi.ESAPI");
var esapiEncoder = esapi.encoder();
return esapiEncoder.encodeForXML(text);