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>

構造的には無効ですが(2つのルート要素があり、XMLプロローグが2回表示されます)、正しく解析できます(つまり、タグが正しく、コンテンツも正しい)。

それで、問題は、JavaにStAX(または他のストリーミングベースの)XMLパーサーがあり、それを可能にするかどうかです。XMLInputFactoryのすべてのオプションをチェックしましたが、パーサーがこの種の不正な形式のXMLを受け入れることを許可していないようです。

4

3 に答える 3

2

文書をそのまま解析するための標準のJavaツールを入手できるかどうかは真剣に疑っています。ただし、境界を自分で見つけて、個々のドキュメントを解析することはできます。の出現を探すだけです"<?xml"

于 2012-04-10T03:54:58.187 に答える
1

新しいXMLヘッダーを検出したときにEOFを1回返す、FilterReaderまたは派生クラスを自分で作成するだけです。FilterInputStream

于 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 に答える