Java - 删除 XML 属性中的双引号

Java - Removing the double quotes in XML attributes

我有一个 xml 字符串,它是通过 REST 调用获得的。但是,某些属性的值已损坏。例如:

<property name="foo" value="Some corrupted String because of "something" like that"/>

如何用单引号替换前面没有 value= 或后面没有 /> 的双引号并得到Java 6?

中损坏的字符串中的有效 XML 字符串

编辑:

我试图修改这个用于 VisualBasic 的 lookahead/lookbehind 正则表达式。但是我猜是因为转义字符不兼容,所以我无法创建它的 Java 版本。这是:

(?<=^[^""]*""(?>[^""]*""[^""]*"")*[^""]*)"(?! \s+ \w+=|\s* [/?]?" >)|(?<!\w+=)""(?=[^""]*""(?>[^""]*""[^""]*"")*[^""]*$)

您可以使用以下正则表达式:

\s+[\w:.-]+="([^"]*(?:"(?!\s+[\w:.-]+="|\s*(?:\/?|\?)>)[^"]*)*)"

参见regex demo。它将匹配任何属性 name/value 对,将后者捕获到我们可以在回调中更改的第 1 组。

这是一个Java code demo:

String s =  "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <resources> <resource> <properties> <property name=\"name\" value=\"retrieveFoo\"/>\n<property name=\"foo\" value=\"Some corrupted String because of \"something\" like that\"/>";
StringBuffer result = new StringBuffer();
Matcher m = Pattern.compile("(\s+[\w:.-]+=\")([^\"]*(?:\"(?!\s+[\w:.-]+=\"|\s*(?:/?|\?)>)[^\"]*)*)\"").matcher(s);
while (m.find()) {
    m.appendReplacement(result, m.group(1) + m.group(2).replace("\"", "&quot;") + "\"");
}
m.appendTail(result);
System.out.println(result.toString());

输出:

<?xml version="1.0" encoding="UTF-8"?> <resources> <resource> <properties> <property name="name" value="retrieveFoo"/> <property name="foo" value="Some corrupted String because of &quot;something&quot; like that"/>