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

时间:2015-11-16 20:55:59

标签: regex xml attributes java-6 double-quotes

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

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

如何使用单引号替换前面没有 value = 或不跟 /&gt; 的双引号,并从中获取有效的XML字符串在Java 6中损坏了一个?

编辑:

我试图修改用于VisualBasic的这个lookahead / lookbehind正则表达式。但是由于逃避字符的不兼容性,我想,我无法创建它的Java版本。这是:

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

1 个答案:

答案 0 :(得分:2)

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

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

regex demo。它会将捕获后者的任何属性名称/值对匹配到我们可以在回调中更改的组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"/>