0
点赞
收藏
分享

微信扫一扫

完美解决dom4j格式化xml回车被删除问题。


直接用dom4j是没法解决问题的,因为在第一步parseText返回 Document对象的时候内部节点属性值中回车就被删了。
通过所谓的setTrim 那个方法没有用,因为第一步就错了

需要用到 dom4j 和 jsoup

<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.12.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>

加入上面的依赖后
将下面方法复制过去。传入xml的字符串进去,返回后就是格式化过的字符串。
对于标签属性值有 回车的会先换成UUID,格式化完成后再替换回来,这样就解决了回车问题,格式就是完美的格式

/**
* 格式化xml字符串
*
* @param str 传入的xml
*/
public static String formatXmlStr(String str) {
try {
// 使用jsoup 将属性值中的回车先使用UUID替换,后面dom4j格式化完成后,再替换回来,这样格式就完美了
Document temp = Jsoup.parse(str, "", Parser.xmlParser());
// 处理标签上变量值中包含换行符的标签,先整体替换为uuid,将内容放入map,key是uuid,value是属性值,后面格式化后重新替换回来
HashMap<String, String> map = new HashMap<>();
Elements allElements = temp.getAllElements();
allElements.forEach(element -> {
element.attributes().forEach(attribute -> {
String value = attribute.getValue();
if (value.contains("\r\n") || value.contains("\n")) {
String uuid = UUID.randomUUID().toString();
//属性名+uuid
String newKey = attribute.getKey() + uuid;
//更新属性值
attribute.setValue(newKey);
map.put(newKey, value);
}
});
});
// 根节点
String xml = allElements.get(0).toString();
// 在构造的时候就导致属性值的回车就没了,这是不对的
org.dom4j.Document doc = DocumentHelper.parseText(xml);
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
StringWriter writer = new StringWriter();
XMLWriter xmlWriter = new XMLWriter(writer, format);
xmlWriter.write(doc);
xmlWriter.close();
StringBuffer sb = new StringBuffer(writer.toString());
// 返回前将变量换回去
map.forEach((k, v) -> {
sb.replace(sb.indexOf(k), sb.indexOf(k) + k.length(), v);
});
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
}
return "";
}


举报

相关推荐

XML:DOM4j解析XML

dom4j读写xml

xml和dom4J

XML解析 - DOM4J

Dom4j读取XML

dom4j解析XML文档

0 条评论