당신은 코드의 수정 된 버전을 사용할 수 있습니다. 파서가 모든 HTML latin1 엔티티의 선언을 가져와야하기 때문에 몇 초 정도 걸립니다. %
으로 시작하지 않는 엔티티를 가져 오면 acc
버퍼에 삽입 된 문자를 대체 할 수 있습니다. &
과 같은 미리 정의 된 항목에주의하십시오.
작업에 자동으로 Sax 필터를 사용할 수도 있습니다. Cfr. 대답 https://stackoverflow.com/a/5524862/452614. 완전한 해결책을 제공하기 위해 내 대답을 업데이트 할 수 있습니다.
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.*;
import org.xml.sax.ext.DefaultHandler2;
class MyHandler extends DefaultHandler2 {
private StringBuilder acc;
public MyHandler() {
acc = new StringBuilder();
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes atts) throws SAXException {
System.out.printf("startElement. uri:%s, localName:%s, qName:%s\n", uri, localName, qName);
acc.setLength(0);
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.printf("endElement. uri:%s, localName:%s, qName:%s\n", uri, localName, qName);
System.out.printf("Characters accumulated: %s\n", acc.toString());
acc.setLength(0);
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
acc.append(ch, start, length);
System.out.printf("characters. [%s]\n", new String(ch, start, length));
}
@Override
public void startEntity(java.lang.String name)
throws SAXException {
System.out.printf("startEntity: %s\n", name);
}
@Override
public void endEntity(java.lang.String name)
throws SAXException {
System.out.printf("endEntity: %s\n", name);
}
}
public class SAXTest1 {
public static void main(String args[]) throws SAXException, ParserConfigurationException, UnsupportedEncodingException {
String s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE author [\n< !ELEMENT author (#PCDATA)>\n<!ENTITY % HTMLlat1 PUBLIC \"-//W3C//ENTITIES Latin 1 for XHTML//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent\"> \n%HTMLlat1;\n]>\n<author>Günther Heinemann</author>";
System.out.println(s);
InputStream stream = new ByteArrayInputStream(s.getBytes("UTF-8"));
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
DefaultHandler2 handler = new MyHandler();
xmlReader.setContentHandler(handler);
xmlReader.setProperty(
"http://xml.org/sax/properties/lexical-handler",
handler);
try {
xmlReader.parse(new InputSource(stream));
} catch (IOException e) {
System.err.println("I/O error: " + e.getMessage());
} catch (SAXException e) {
System.err.println("Parsing error: " + e.getMessage());
}
}
}
프로그램 실행 :
$ java SAXTest1
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE author [
<!ELEMENT author (#PCDATA)>
<!ENTITY % HTMLlat1 PUBLIC "-//W3C//ENTITIES Latin 1 for XHTML//EN" "http://www.w3. org/TR/xhtml1/DTD/xhtml-lat1.ent">
%HTMLlat1;
]>
<author>Günther Heinemann</author>
startEntity: %HTMLlat1
endEntity: %HTMLlat1
startElement. uri:, localName:, qName:author
characters. [G]
startEntity: uuml
endEntity: uuml
characters. [ünther Heinemann]
endElement. uri:, localName:, qName:author
Characters accumulated: Günther Heinemann
의 중복 가능성 [SAX 파서 : 특수 문자를 무시 (http://stackoverflow.com/questions/5475202/sax-parser-ignoring-special-characters) – lkuty