我有以下无效的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。
答案 0 :(得分:2)
我严重怀疑你是否能够获得任何标准的java工具来解析文档。但是,您可以自己找到边界并解析单个文档。只需查找"<?xml"
。
答案 1 :(得分:1)
只需给自己写一个FilterReader
或FilterInputStream
派生类,当它看到新的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;
}
希望这有帮助