Java 및 SAX로 XML 파일을 안드로이드 장치로 구문 분석하려고합니다. 나는 인터넷에서 얻었고 구문 분석을하는 동안 문자 "é"에 올바른 형식 (유효하지 않은 토큰)이 아닌 ExpatException이 발생합니다. xml 파일의 모든 specials 문자를 변경하지 않고도 해당 문자를 처리 할 수 있습니까?SAX 특수 문자 처리
편집 : 여기 내 코드에서 내 SDcard에 파일을 쓰는 부분입니다.
SAXParserFactory fabrique = SAXParserFactory.newInstance();
SAXParser parseur = null;
ArrayList<Semaine> semaines = null;
try {
parseur = fabrique.newSAXParser();
DefaultHandler handler = new ParserSemaines();
File f = new File(Environment.getExternalStorageDirectory(),"edt.xml");
parseur.parse(f, handler);
semaines = ((ParserSemaines) handler).getData();
}
: 여기
public class ParserSemaines extends DefaultHandler {
private final String SEMAINE = "span";
private final String DESCRIPTION = "description";
private ArrayList<Semaine> semaines;
private boolean inSemaine;
private Semaine currentSemaine;
private StringBuffer buffer;
@Override
public void processingInstruction(String target, String data) throws SAXException {
super.processingInstruction(target, data);
}
public ParserSemaines() {
super();
}
@Override
public void startDocument() throws SAXException {
super.startDocument();
semaines = new ArrayList<Semaine>();
}
@Override
public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
buffer = new StringBuffer();
if (localName.equalsIgnoreCase(SEMAINE)){
this.currentSemaine = new Semaine();
this.currentSemaine.setDate(attributes.getValue("date"));
this.inSemaine = true;
}
if(localName.equalsIgnoreCase(DESCRIPTION)){
this.currentSemaine.setDescription(buffer.toString());
}
}
@Override
public void endElement(String uri, String localName, String name) throws SAXException {
if (localName.equalsIgnoreCase(SEMAINE)){
this.semaines.add(currentSemaine);
this.inSemaine = false;
}
}
public void characters(char[] ch,int start, int length) throws SAXException{
String lecture = new String(ch,start,length);
if(buffer != null) buffer.append(lecture);
}
public ArrayList<Semaine> getData(){
return semaines;
}
}
내가 파서 전화를 걸 때 사용하는 코드입니다 : 여기
<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet type="text/xsl" href="ttss.xsl"?>
<timetable>
<option combined="0" totalweeks="0" showemptydays="0" dayclass="reverse">
<link href="g56065.xml" class="xml">Imprimer</link>
<link href="g56065.pdf" class="pdf">Version PDF</link>
<weeks>Semaines</weeks>
<dates>Dates</dates>
<week>Semaine</week>
<date>Date</date>
<all>Toutes les semaines</all>
<notes>Remarques</notes>
<id>ID</id>
<tag>Champs Libre</tag>
<footer>Publié le 10/09/2011 22:14:28</footer>
... </timetable>
가 파싱 코드 : 여기
File SDCardRoot = Environment.getExternalStorageDirectory();
File f = new File(SDCardRoot,"edt.xml");
f.createNewFile();
FileOutputStream fileOutput = new FileOutputStream(f);
InputStream inputStream = urlConnection.getInputStream();
byte[] buffer = new byte[1024];
int bufferLength = 0;
while ((bufferLength = inputStream.read(buffer)) > 0) {
fileOutput.write(buffer, 0, bufferLength);
}
fileOutput.close();
내 XML의 일부입니다
다른 코드 부분이 필요한지 물어보십시오.
확인 후 SD 카드의 xml 파일에 "é"가 "�"로 표시됩니다. 그게 문제가되어야하지만 나는 어떤 단서를 가지고 있지 않습니다. 또한 URI로 구문 분석을 시도했지만 항상 동일한 예외가 발생해도 아무 것도 변경하지 않습니다.
SAX 파서는 아무런 문제없이 비 ASCII 문자를 처리해야합니다. 코드 및 XML 예제를 보여줍니다. – parsifal
다음 중 하나와 비슷하게 들립니다. 1. XML 파일이 잘못 인코딩되었거나 2. XML 파일이 HTTP 헤더로 표시된 문자 인코딩과 함께 인터넷에서 올바르게 제공되고 파일을 로컬에 저장할 때 해당 정보를 잃어 버렸습니다. –
표시된 코드는 데이터를 원시 바이트로 복사하므로 어떠한 방식 으로든 XML 인코딩을 혼동 할 수 없습니다. 파싱 코드를 보여줘야합니다. –