用dom4j 解析 普通的XML速度倒是挺快的。。
但是解析hbm.xml的时候 时间就会很慢。。
我只是取其中的id的部分节点值 肿么可以更高效的读取呢??
现在读取的话 大概4个HBM.XML 需要2分多钟才能出来。。
而且2个HBM都不超过10个字段 没有set。
2个方法:
[code="java"]
//读取XML文件返回doc实体
public Document getDocumentByPath(String path){
SAXReader saxReader = new SAXReader();
Document document;
String end="";
try {
document = saxReader.read(path);
return document;
} catch (DocumentException e) {
e.printStackTrace();
return null;
}
}
//读取需要的节点值 并返回
public String getXmlValue(Document doc,String rootName){
SAXReader saxReader = new SAXReader();
Document document=doc;
String end="";
try {
//获取并返回所有对应节点的属性值
List list = document.selectNodes(rootName);
Iterator iter = list.iterator();
while (iter.hasNext()) {
Attribute attribute = (Attribute) iter.next();
end=attribute.getValue();
break;
}
return end;
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
[/code]
求指点。。
跳过DTD检查,部分代码如下:
[code="java"]
SAXBuilder sax = new SAXBuilder();
sax.setValidation(false);
sax.setEntityResolver(new EntityResolver(){//设置DTD验证
public InputSource resolveEntity(String publicId, String systemId)
throws FileNotFoundException {
String localTLDPath = "";
InputSource is = null;
if(!"".equals(localTLDPath)){//设置了本地DTD验证
is = new InputSource(new FileInputStream(localTLDPath));
is.setPublicId(publicId);
is.setSystemId(systemId);
}else{//不验证
is = new InputSource(new StringReader(""));
}
return is;
}
});
result = sax.build(in);
[/code]
jdom试试
这个不建议直接解析,hbm.xml中含有http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd的定义文件,需要从官网下载,然后才进行解析的,如果上不了网甚至都解析不了。
建议直接读文件内容 或读出文件后将dtd定义删除后再通过dom4j解析。
这用的是sax解析,不是dom解析,sax解析不把xml全部加载,而是逐行扫描的;dom解析xml是把文档在内存中全部构建后直接访问。
对于频繁读取的xml建议使用dom解析把文档全部加载