1

嗨,我发现 apache 运算符非常有用

StringUtils.substringBetween(fileContent, "<![CDATA[", "]]>") 

提取里面的信息

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<envelope>
    <xxxx>
        <yyyy>
            <![CDATA[

                    <?xml version="1.0" encoding="UTF-8" ?>
                    <Document >
                        <eee>
                            <tt>
                                <ss>zzzzzzz</ss>
                                <aa>2021-09-09T10:39:29.850Z</aa>
                                <aaaa>
                                    <Cd>cccc</Cd>
                                </aaaa>
                                <dd>ssss</dd>
                                <ff></ff>
                            </tt>
                        </eee>
                    </Document>
                ]]>
        </yyyy>
    </xxxx>
</envelope>

但现在我正在寻找的是另一个允许我替换动态 xml 的运算符或正则表达式

![CDATA["old_xml"]] 

由另一个 xml

![CDATA["new_xml"]]

知道如何做到这一点吗?

问候。

4

2 回答 2

1

代替StringUtils,您可以使用String#replaceAll方法:

fileContent = fileContent
  .replaceAll("(?s)(<!\\[CDATA\\[).+?(]]>)", "$1foo$2");

解释:

  • (?s):启用DOTALL模式,以便.可以匹配换行符以及.+?
  • (<!\\[CDATA\\[): 匹配开始<![CDATA[子串并在组 #1 中捕获
  • .+?: 匹配 0 个或多个任意字符,包括换行符
  • (]]>): 匹配结束]]?子串并在组 #2 中捕获
  • $1foo$2foo: 用两边的捕获组 1 和 2 的反向引用替换为环绕
于 2021-10-29T22:26:54.773 回答
1

您可以使用正则表达式, (\<!\[CDATA\[).*?(\]\]>)

演示:

public class Main {
    public static void main(String[] args) {
        String xml = """
                ...
                    <data><![CDATA[a < b]]></data>
                ...
                """;

        String replacement = "foo";

        xml = xml.replaceAll("(\\<!\\[CDATA\\[).*?(\\]\\]>)", "$1" + replacement + "$2");

        System.out.println(xml);
    }
}

输出:

...
    <data><![CDATA[foo]]></data>
...

正则表达式的解释

  • (: 组#1 的开始
    • \<!\[CDATA\[: 细绳<![CDATA[
  • ): 组#1 结束
  • .*?: 任意字符任意次数
  • (: 组#2 的开始
    • \]\]>: 细绳]]>
  • ): 组#2 结束
于 2021-10-29T23:00:10.867 回答