Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用SAX解析器使用二进制数据元素解析XML文件?_Java_Blob_Sax - Fatal编程技术网

Java 如何使用SAX解析器使用二进制数据元素解析XML文件?

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

我收到需要解析的XML文件。我经常用java编写代码,所以java SAX是我的天赋 第一选择。XML文件包含文本元素和一个二进制元素(.xls文件)的组合

我的解析器处理程序如下所示:

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算法)。要获取原始二进制数据,您需要反转此过程——即,将文本转换回二进制数据。