0

我有以下无效的 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。

4

3 回答 3

2

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

于 2012-04-10T03:54:58.187 回答
1

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

于 2012-04-10T04:44:16.897 回答
0

我已经创建了一个解析方法,它返回我的消息,它是消息类型的类(它的我的类具有我需要过滤掉的 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;
}

希望这可以帮助

于 2012-04-10T05:00:29.433 回答