2015-11-16 7 views
0

У меня есть строка xml, которую я получаю через вызов REST. Однако некоторые атрибуты имеют поврежденные значения. Например:Java - Удаление двойных кавычек в атрибутах XML

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

Как я могу заменить двойные кавычки, либо не предшествует значение = или нет follown по /> с одиночной кавычки и получить правильную строку XML из этого поврежден один в Java 6?

EDIT:

Я попытался изменить это опережение/регулярное выражение, которое просмотр назад было использовано для VisualBasic. Но из-за несовместимости escape-символов, я думаю, я не мог создать его версию Java. Вот оно:

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

+0

Пожалуйста, поделитесь, что вы пробовали до сих пор. –

+0

Ну, я попытался изменить это регулярное выражение lookahead/lookbehind, которое использовалось для VisualBasic. Но из-за несовместимости escape-символов, я думаю, я не мог создать его версию Java. Вот он: '(? <=^[^" "] *" "(?> [^" "] *" "[^" "] *" ") * [^" "] *)" (? ! \ s + \ w + = | \ s * [/?]? ">) | (? [^" "] *" "[^" "] *" ") * [^" "] * $)' – vahdet

+1

Вам лучше с чем-то вроде ['\\ s + [\\ w: .-] + = \" ([^ \ " ] * | '] (HTTPS (:: \ "(\\ s + [\\ ш .-] + = \?!" \\ s * />) [^ \ "*) \] *?)": //regex101.com/r/cP7fD2/1), а затем просто замените двойные кавычки внутри каждой группы 1. Посмотрите на [это демо] (http://ideone.com/Rx2q4H). –

ответ

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"/>

+0

Преобразовал свой ответ на C# для кого-то другого (ваш начальник RegEx). http://stackoverflow.com/a/37177420/214898 –