sách gpt4 ai đã đi

SAX xử lý các ký tự đặc biệt

In lại 作者:行者123 更新时间:2023-12-02 08:11:08 28 4
mua khóa gpt4 Nike

我正在尝试使用 Java 和 SAX 为 Android 设备解析 XML 文件。我从互联网上获取,在解析它时,我得到一个 ExpatException :字符“é”的格式不正确(无效标记)。有没有办法处理这些字符而不必更改 xml 文件中的所有特殊字符?

编辑:这是将文件写入 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 的一部分:






这是解析代码:

public class ParserSemaines extends DefaultHandler {
private final String SEMAINE = "span";
private final String DESCRIPTION = "description";
private ArrayList semaines;
private boolean inSemaine;
private Semaine currentSemaine;
private StringBuffer buffer;
@Ghi đè
public void processingInstruction(String target, String data) throws SAXException {
super.processingInstruction(target, data);
}
public ParserSemaines() {
siêu();
}

@Ghi đè
public void startDocument() throws SAXException {
super.startDocument();
semaines = new ArrayList();
}

@Ghi đè
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());
}
}

@Ghi đè
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 getData(){
return semaines;
}
}

这是我用来调用解析器的代码:

SAXParserFactory fabrique = SAXParserFactory.newInstance();
SAXParser parseur = null;
ArrayList semaines = null;
thử {
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 进行解析,但它不会改变任何内容,我总是遇到相同的异常。

1 Câu trả lời

After check it appears that the xml file in the SDcard shows "é" as "�".

这确实表明存在编码问题。

您发布的代码似乎是从 URL 到文件的正确的逐字节副本,因此该文件应准确表示您从 URL 获取的内容。这意味着服务器的响应可能不是 ISO-8859-1 格式的。

我的下一步是使用 Fiddler 等工具检查整个响应,特别注意:

  • Content-Type header 。如果它告诉您不同的字符集,您必须将该信息传递给解析器和/或手动转换它。
  • 返回的实际字节数。据您所知,Content-Type 和 XML 序言都可能在撒谎。如果文件确实是 ISO-8859-1,则带重音符号的 e 的字节值应为 0xE9。如果内容实际上是 UTF-8,则应该有两字节序列 0xC3 0xA9(请参阅 đây )。您显示的是一个三字节序列,这是没有意义的。但最好检查一下来源。

此外,请验证您在将文件传递给 SAX 解析器之前KHÔNG将其转换为字符串。

<小时>

供引用:我编写了一个最小的程序,它连接到 OP 的 URL 并将该连接直接传递到最小的 SAX 解析器。它似乎运行没有错误。我还使用了 DOM 解析器,并验证了至少根元素已被正确解析。

public static void main(String[] argv)
throws Exception
{
URL url = new URL("http://www.disvu.u-bordeaux1.fr/et/edt_etudiants2/Master/Semestre1/g56065.xml");
InputStream in = url.openConnection().getInputStream();

SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser parser = spf.newSAXParser();
parser.parse(in, new DefaultHandler());
System.out.println("parse successful");
}

关于java - SAX 处理特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7403056/

28 4 0
Bài viết được đề xuất: java - 需要通过http输出流发送多个对象
Bài viết được đề xuất: java - 如何一次性构建多个 Android 项目
Bài viết được đề xuất: 执行@number时的Java链接列表错误消息
Bài viết được đề xuất: java - Struts基本类加载问题
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com