直接用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 "";
    }
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐