关于dom4j 解析hbm.xml文件。。

用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]

求指点。。

ffhelly
ffhelly 不论是jdom或dom4j 读取hbm文件的时候 需要取消掉DTD文件的验证 速度问题就能解决了。。感谢各位。 DOM4J: saxReader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd",false); JDOM 按照libo_591的方法就可以了。
7 年多之前 回复

4个回答

跳过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试试

iteye_5246
iteye_5246 那就把xml当文本解析。或者看hibernate解析xml应该有对应的工厂处理类
7 年多之前 回复
ffhelly
ffhelly 但是这样解析还是很慢啊。。 我这要是10几个XML 那不得要 好几分钟的解析时间。。
7 年多之前 回复
iteye_5246
iteye_5246 大的xml用jdom,小的就用dom4j
7 年多之前 回复
ffhelly
ffhelly 是这么做的。 比较在意这个解析速度。。 解析普通的xml 很速度。 但是解析hbm.xml 就会很慢。。 刚测试一个 14个字段 没有set集会的 hbm.xml 同样读取<id>标签syso其中的name的值 jdom 21秒 dom4j 18秒。。
7 年多之前 回复
iteye_5246
iteye_5246 1.xml解析处理类,想jdom,dom4j 2.解析xml文本,根据标签截取,获取属性。
7 年多之前 回复
ffhelly
ffhelly 感觉2个时间都差不多 现在解析的一个HBM.XML。。 有个2,30秒左右吧。。
7 年多之前 回复

这个不建议直接解析,hbm.xml中含有http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd的定义文件,需要从官网下载,然后才进行解析的,如果上不了网甚至都解析不了。

建议直接读文件内容 或读出文件后将dtd定义删除后再通过dom4j解析。

ffhelly
ffhelly 已经用dom4j 和jdom 都测试过了 取消DTD验证 速度很快了。。 感谢
7 年多之前 回复

这用的是sax解析,不是dom解析,sax解析不把xml全部加载,而是逐行扫描的;dom解析xml是把文档在内存中全部构建后直接访问。
对于频繁读取的xml建议使用dom解析把文档全部加载

Eclipsekll5h
Eclipsekll5h hibernate解析xml依赖dom4j
7 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问