有一个字符串,这个字符串是xml格式,怎么解析它最好呢?
当然是针对稍微大一点的xml字符串而言,如果都是一点点,那不管用什么工具解析,效率不会有太大区别。
内存的使用方面:
虽然字符串已经加载到内存中了,但是如果被xml解析器解析的话,解析器还是会再加载自己的单独一份内存,故而流的解析方式是最省内存的。
解析耗时方面:
因为字符串是已经被加载到内存中了,所以能对字符串直接进行解析是最快的,但是可惜的是到目前为止我还没有发现哪个xml解析器会直接解析xml格式的字符串,他们都是把字符串重新加载为一个InputStream,然后进入和解析文档同一入口的解析流程。
值得一提的是dom4j提供了一个parseText(String s)方法,返回Document,但是打开源码不难发现,那只是一个假象。附上dom4j源码方法:
所以既然大家都是解析一个InputStream,那当然是SAX或者StAX这种解析xml流的方式最快了效率最高最省内存了。
最后,我认为一般以字符串形式呈现的xml,应该都很小,那么用什么方式去解析如果对性能不是特别苛刻的话,可以不考虑,用户感知不到并且体验良好就是王道。
当然是针对稍微大一点的xml字符串而言,如果都是一点点,那不管用什么工具解析,效率不会有太大区别。
内存的使用方面:
虽然字符串已经加载到内存中了,但是如果被xml解析器解析的话,解析器还是会再加载自己的单独一份内存,故而流的解析方式是最省内存的。
解析耗时方面:
因为字符串是已经被加载到内存中了,所以能对字符串直接进行解析是最快的,但是可惜的是到目前为止我还没有发现哪个xml解析器会直接解析xml格式的字符串,他们都是把字符串重新加载为一个InputStream,然后进入和解析文档同一入口的解析流程。
值得一提的是dom4j提供了一个parseText(String s)方法,返回Document,但是打开源码不难发现,那只是一个假象。附上dom4j源码方法:
public static Document parseText(String text) throws DocumentException {
Document result = null;
SAXReader reader = new SAXReader();
String encoding = getEncoding(text);
InputSource source = new InputSource(new StringReader(text));
source.setEncoding(encoding);
result = reader.read(source);
// if the XML parser doesn't provide a way to retrieve the encoding,
// specify it manually
if (result.getXMLEncoding() == null) {
result.setXMLEncoding(encoding);
}
return result;
}
所以既然大家都是解析一个InputStream,那当然是SAX或者StAX这种解析xml流的方式最快了效率最高最省内存了。
最后,我认为一般以字符串形式呈现的xml,应该都很小,那么用什么方式去解析如果对性能不是特别苛刻的话,可以不考虑,用户感知不到并且体验良好就是王道。