私はアンドロイドデバイス用にJavaとSAXを使用してXMLファイルを解析しようとしています。私はインターネットから取得し、それを解析しているときに、ExpatExceptionが発生しています。文字「é」の整形式ではありません(無効なトークン)。 xmlファイル内のすべてのスペシャル文字を変更することなく、それらの文字を処理する方法はありますか?SAX処理の特殊文字
編集: ここは私のSDカードにファイルを書き込むコードの一部です。ここで
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の一部である:ここ
<?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>
は、解析コードである:ここ
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;
}
}
は、私は、パーサーを呼び出すために使用するコードです:
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();
}
その他のコード部分が必要かどうか質問します。
チェックした後、SDカードのxmlファイルに「é」が「�」と表示されます。 それは問題であるはずですが、なぜ私は何の手がかりも持っていません。 私もURIと解析しようとしましたが、私はいつも同じ例外を何も変えません。
SAXパーサーは、非ASCII文字を問題なく処理する必要があります。あなたのコードとあなたのXMLの例を表示してください。 – parsifal
1. XMLファイルが正しくエンコードされていないか、2. XMLファイルがHTTPヘッダーで示された文字エンコーディングでインターネット上で正しく提供されていて、ファイルをローカルに保存するときにその情報が失われた。 –
このコードでは、データを生のバイトとしてコピーしているため、XMLのエンコーディングを混同することはできません。解析コードを表示する必要があります。 –