我可以在Java中使用较少验证的StAX解析器吗?

时间:2012-04-10 03:23:35

标签: java xml streaming xml-parsing stax

我有以下无效的XML文件:

<?xml version="1.0" encoding="utf-8" ?>
<Page num="1" crop_box="0, 0, 595, 842" media_box="0, 0, 595, 842" rotate="0">
    <Flow id="1">
        <Para id="1">
            <Line box="90, 754.639, 120.038, 12">
                <Word box="90, 754.639, 22.6704, 12">This</Word>
            </Line>
        </Para>
    </Flow>
</Page>
<?xml version="1.0" encoding="utf-8" ?>
<Page num="1" crop_box="0, 0, 595, 842" media_box="0, 0, 595, 842" rotate="0">
    <Flow id="1">
        <Para id="1">
            <Line box="90, 754.639, 120.038, 12">
                <Word box="90, 754.639, 22.6704, 12">This</Word>
            </Line>
        </Para>
    </Flow>
</Page>

虽然它在结构上无效(它有两个根元素,XML序言显示两次),但它仍然可以被正确解析(即标签是正确的,内容也是正确的)。

所以,问题是,Java中是否有一个StAX(或任何其他基于流的)XML解析器允许我这样做?我已经检查了 XMLInputFactory 中的所有选项,但它们似乎都不允许解析器接受这种格式错误的XML。

3 个答案:

答案 0 :(得分:2)

我严重怀疑你是否能够获得任何标准的java工具来解析文档。但是,您可以自己找到边界并解析单个文档。只需查找"<?xml"

的出现次数

答案 1 :(得分:1)

只需给自己写一个FilterReaderFilterInputStream派生类,当它看到新的XML标题时返回EOF一次。

答案 2 :(得分:0)

我已经制作了一个解析方法,它返回了一个消息,它是Type消息的类(它的我的类具有我需要过滤掉的Rss内容)

我的方法如下:

    @Override
public List<Message> parse() {
    // TODO Auto-generated method stub
    final Message currentMessage = new Message();
    RootElement root = new RootElement(RSS);
    final List<Message> message = new ArrayList<Message>();
    Element channel = root.getChild(CHANNEL);
    Element item = channel.getChild(ITEM);

    item.setEndElementListener(new EndElementListener() {

        @Override
        public void end() {
            message.add(currentMessage.copy());     
        }
    });

    item.getChild(TITLE).setEndTextElementListener(new EndTextElementListener(){
        public void end(String body) {
            currentMessage.setTitle(body);
        }
    }); 

    item.getChild(LINK).setEndTextElementListener(new EndTextElementListener() {
        @Override
        public void end(String body) {
            currentMessage.setLink(body);   
        }
    });
    item.getChild(DESCRIPTION).setEndTextElementListener(new EndTextElementListener(){
        public void end(String body) {
            currentMessage.setDescription(body);
        }
    });
    item.getChild(PUB_DATE).setEndTextElementListener(new EndTextElementListener(){
        public void end(String body) {
            currentMessage.setDate(body);
        }
    });
    /*item.getChild(IMAGE).setEndTextElementListener(new EndTextElementListener(){
        public void end(String body) {
            currentMessage.setImage(body);
        }
    });*/

    try {
        Xml.parse(this.getInputStream(), Xml.Encoding.UTF_8, root.getContentHandler());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    catch(Exception e){
        e.printStackTrace();
    }


    return message;
}

希望这有帮助