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("\"", """) + "\"");
}
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 "something" like that"/>
我有一个 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("\"", """) + "\"");
}
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 "something" like that"/>