문제

내 환경에서 나는 Java를 사용하여 결과를 XML로 직렬화합니다. 기본적으로 다음과 같습니다.

//foreach column of each row
xmlHandler.startElement(uri, lname, "column", attributes);
String chars = rs.getString(i);
xmlHandler.characters(chars.toCharArray(), 0, chars.length());
xmlHandler.endElement(uri, lname, "column");

XML은 Firefox에서 다음과 같습니다.

<row num="69004">
    <column num="1">10069</column>
    <column num="2">sd&#26;</column>
    <column num="3">FCVolume                      </column>
</row>

하지만 XML을 구문 분석하면

org.xml.sax.saxparseexception : 문자 참조 "&#26"유효하지 않은 XML 문자입니다.

내 질문은 지금 : 어떤 charactes를 교체해야합니까, 또는 내 문자를 어떻게 인코딩해야합니까?

도움이 되었습니까?

해결책

나는 흥미로운 목록을 찾았다 XML 사양: 그 목록에 따르면 캐릭터 #26 (16 진수 : 16 진 : #x1a).

다음 범위에 정의 된 문자도 낙담합니다. 그들은 제어 문자이거나 영구적으로 정의되지 않은 유니 코드 문자입니다.

참조 완전한 범위.

이 코드는 모든 비 밸리드 XML UTF8을 문자열에서 대체합니다.

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();
}    

그 결과로 가져 왔습니다 유효하지 않은 XML 문자 : 유효한 UTF8이 유효한 XML을 의미하지 않는 경우

그러나 그로 인해 여전히 UTF-8 호환성 문제가있었습니다.

org.xml.sax.SAXParseException: Invalid byte 1 of 1-byte UTF-8 sequence

읽고 나서 XML- XML을 서블릿에서 UTF -8으로 반환합니다 다음과 같이 ContentType를 설정하면 어떻게되는지 시도했습니다.

response.setContentType("text/xml;charset=utf-8");

그리고 그것은 효과가있었습니다 ....

다른 팁

확장 가능한 마크 업 언어 (XML) 1.0 말 :

Ampersand 문자 (&) 및 왼쪽 각도 브래킷 (<)은 마크 업 구분 장치로 사용하거나 주석, 처리 명령어 또는 CDATA 섹션을 사용하는 경우를 제외하고는 문자 그럴 형식으로 표시되어서는 안됩니다. 다른 곳에서 필요한 경우 숫자 문자 참조 또는 문자열 "&"및 "<"를 사용하여 탈출해야합니다. 직각 브래킷 (>)은 문자열 ">"을 사용하여 표시 될 수 있으며, 호환성을 위해 문자열에 나타날 때 ">"또는 문자 참조를 사용하여 빠져 나와야합니다. 문자열은 CDATA 섹션의 끝을 표시하지 않습니다.

cdata를 사용하는 경우 인코딩을 건너 뛸 수 있습니다.

<column num="1"><![CDATA[10069]]></column>
<column num="2"><![CDATA[sd&]]></column>

어떤 버전의 JRE를 실행하고 있습니까? 색소폰 프로젝트 말 :

J2SE 1.4는 이전 버전의 SAX2를 번들로 묶습니다. SAX2 r2 이상을 사용할 수 있도록하려면 어떻게해야합니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top