Java 如何使用SAX解析器使用二进制数据元素解析XML文件?
我收到需要解析的XML文件。我经常用java编写代码,所以java SAX是我的天赋 第一选择。XML文件包含文本元素和一个二进制元素(.xls文件)的组合 我的解析器处理程序如下所示:Java 如何使用SAX解析器使用二进制数据元素解析XML文件?,java,blob,sax,Java,Blob,Sax,我收到需要解析的XML文件。我经常用java编写代码,所以java SAX是我的天赋 第一选择。XML文件包含文本元素和一个二进制元素(.xls文件)的组合 我的解析器处理程序如下所示: public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException{ if(qName.equalsIgnoreC
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException{
if(qName.equalsIgnoreCase("To")){
toFlag = true;
}
if(qName.equalsIgnoreCase("Subject")){
subjectFlag = true;
}
if(qName.equalsIgnoreCase("OutDocumentId")){
outdocmentIdFlag = true;
}
if(qName.equalsIgnoreCase("Filename")){
filenameFlag = true;
}
if(qName.equalsIgnoreCase("EmailType")){
emailTypeFlag = true;
}
if(qName.equalsIgnoreCase("Context")){
contextTypeFlag = true;
}
if(qName.equalsIgnoreCase("Blob")){
blobTypeFlag = true;
}
}
元素数据在这里被解析:
public void characters(char ch[], int start, int length) throws SAXException{
String text = null;
if (toFlag) {
text = new String(ch, start, length);
getRequest().setRecipientEmail(text);
toFlag = false;
}
if (subjectFlag) {
text = new String(ch, start, length);
getRequest().setSubject(text);
subjectFlag = false;
}
if (outdocmentIdFlag) {
text = new String(ch, start, length);
getRequest().setOutDocId(text);
outdocmentIdFlag = false;
}
if (filenameFlag) {
text = new String(ch, start, length);
getRequest().setFilename(text);
filenameFlag = false;
}
if(emailTypeFlag) {
text = new String(ch, start, length);
getRequest().setEmailType(Integer.parseInt(text));
emailTypeFlag = false;
}
if(contextTypeFlag) {
text = new String(ch, start, length);
getRequest().setContext(text);
contextTypeFlag = false;
}
if(blobTypeFlag) {
text = new String(ch, start, length);
try {
getRequest().setBlob(Hibernate.createBlob(text.getBytes("UTF-16")));
} catch (UnsupportedEncodingException e) {
System.out.println("Error creating blob");
e.printStackTrace();
}
blobTypeFlag = false;
}
}
}
问题在于blob元素,它作为char[]读入
(我认为这是不正确的)。。。因为那是他们的父母
类允许在事件处理期间重写
当一个元素不可用时,有人知道如何使用SAX解析吗
文本而不是二进制
非常感谢获取字符数据并将其发送到一个文件。如果他们将原始二进制文件转储到一个文件中,则该文件不是格式良好的XML(因为存在大量不允许使用的字符),并且没有符合要求的解析器将对其进行解析。希望他们使用Base64或类似的东西对二进制数据进行编码,在这种情况下,它实际上是字符数据(但需要解码)。如果他们正在将原始二进制数据转储到文件中,您需要让他们更改它。因为它们给你的不是XML。除非你解析巨大的文档或性能是绝对关键的,考虑使用DOM解析器,如JDOM(www. jDOM.org)——它会使你的任务变得简单很多。考虑使用STAX,它将提高可读性,这对目前的帮助是有帮助的,但是我不确定我是否理解如何从ch[]使用Base64.decodeBase64()。。是否需要先将ch[]转换为字符串?我觉得如果是这样的话,我会失去一些东西。首先将char数组转换为字符串,就像转换任何其他文本值一样。然后将字符串传递给解码器。正如其他人指出的,在XML文档中存储二进制数据的唯一方法是首先将其编码为文本(通常使用Base64算法)。要获取原始二进制数据,您需要反转此过程——即,将文本转换回二进制数据。