use defaut doc impl

This commit is contained in:
Looly
2019-11-16 05:42:38 +08:00
parent 4dea1f231a
commit 61c06d3971
3 changed files with 122 additions and 52 deletions

View File

@@ -56,11 +56,23 @@ public class XmlUtil {
/**
* 在XML中无效的字符 正则
*/
public final static String INVALID_REGEX = "[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f]";
public static final String INVALID_REGEX = "[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f]";
/**
* XML格式化输出默认缩进量
*/
public final static int INDENT_DEFAULT = 2;
public static final int INDENT_DEFAULT = 2;
/**
* 默认的DocumentBuilderFactory实现
*/
private static String defaultDocumentBuilderFactory = "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl";
/**
* 禁用默认的DocumentBuilderFactory禁用后如果有第三方的实现如oracle的xdb包中的xmlparse将会自动加载实现。
*/
synchronized public static void disableDefaultDocumentBuilderFactory(){
defaultDocumentBuilderFactory = null;
}
// -------------------------------------------------------------------------------------- Read
@@ -387,16 +399,34 @@ public class XmlUtil {
* @since 4.1.2
*/
public static DocumentBuilder createDocumentBuilder() {
final DocumentBuilderFactory dbf = disableXXE(DocumentBuilderFactory.newInstance());
DocumentBuilder builder;
try {
builder = dbf.newDocumentBuilder();
builder = createDocumentBuilderFactory().newDocumentBuilder();
} catch (Exception e) {
throw new UtilException(e, "Create xml document error!");
}
return builder;
}
/**
* 创建{@link DocumentBuilderFactory}
* <p>
* 默认使用"com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl"<br>
* 如果使用第三方实现,请调用{@link #disableDefaultDocumentBuilderFactory()}
* </p>
*
* @return {@link DocumentBuilderFactory}
*/
public static DocumentBuilderFactory createDocumentBuilderFactory(){
final DocumentBuilderFactory factory;
if(StrUtil.isNotEmpty(defaultDocumentBuilderFactory)){
factory = DocumentBuilderFactory.newInstance(defaultDocumentBuilderFactory, null);
} else{
factory = DocumentBuilderFactory.newInstance();
}
return disableXXE(factory);
}
/**
* 创建XML文档<br>
* 创建的XML默认是utf8编码修改编码的过程是在toStr和toFile方法里即XML在转为文本的时候才定义编码