我需要解析连续的格式良好的XML元素流,我只给它一个已构造的java.io.Reader对象.这些元素不包含在根元素中,也不是像XML标题一样<?xml version="1.0"?>",而是有效的XML.
使用Java org.xml.sax.XMLReader类不起作用,因为XML Reader期望从封闭的根元素开始解析格式良好的XML.因此,它只读取流中的第一个元素,它将其视为根,并在下一个元素中失败,典型的
org.xml.sax.SAXParseException:根元素后面的文档中的标记必须格式正确.
对于不包含根元素的文件,但是这样的元素确实存在或者可以定义(并且被称为MyRootElement),可以执行以下操作:
Strint path = <the full path to the file>;
XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
StringBuilder buffer = new StringBuilder();
buffer.append("<?xml version=\"1.0\"?>\n");
buffer.append("<!DOCTYPE MyRootElement ");
buffer.append("[<!ENTITY data SYSTEM \"file:///");
buffer.append(path);
buffer.append("\">]>\n");
buffer.append("<MyRootElement xmlns:...>\n");
buffer.append("&data;\n");
buffer.append("</MyRootElement>\n");
InputSource source = new InputSource(new StringReader(buffer.toString()));
xmlReader.parse(source);
Run Code Online (Sandbox Code Playgroud)
我已经通过将部分java.io.Reader输出保存到文件来测试上述内容并且它可以工作.但是,这种方法在我的情况下不适用,并且无法插入此类额外信息(XML标头,根元素),因为java.io.Reader已经构造了传递给我的代码的对象.
基本上,我正在寻找"碎片式XML解析".所以,我的问题是,可以使用标准Java API(包括org.sax.xml.*和java.xml.*包)来完成吗?
stackoverflow上有很多关于如何使用Gson反序列化json数组的信息.
但是我如何使用XStreamjettison 做同样的事情呢?
这是json:
{"entity":[{"id":"1", "name":"aaa"}, {"id":"2", "name":"bbb"}]}
Run Code Online (Sandbox Code Playgroud)
以下是XStream我尝试解析它的代码:
XStream xstream = new XStream(new JettisonMappedXmlDriver());
xstream.alias("entity", Entity[].class);
return (Entity[])xstream.fromXML(jsonString);
Run Code Online (Sandbox Code Playgroud)
我有以下例外:
com.thoughtworks.xstream.converters.ConversionException: id : id
Run Code Online (Sandbox Code Playgroud)