Как вы знаете, действительный XML должен быть проанализирован, поскольку нет нечеткого соответствия, как в HTML.Стандартным решением является размещение <![CDATA[....]]>
.( CDATA обозначает символьные данные .)
<short_desc><![CDATA[text 1 & 2]]></short_desc>
<short_desc><![CDATA[text 2 <this is a short desc> ]]></short_desc>
Это громоздко, и вопрос заключается в том, работает ли использование, когда текст вместо CDataожидается.И создание правильного XML, вероятно, проще.Apache commons также имеет StringEscapeUtils.escapeXml10(String)
для этой цели.
Сначала попробуйте (CDATA).
String xml = new String(Files.readAllBytes(Paths.get("C:\\test\\file.xml")),
StandardCharsets.UTF_8);
xml = "<?xml version=\"1.0\">\n" + xml;
xml = xml.replace("<short_desc>", "<short_desc><![CDATA[");
xml = xml.replace("</short_desc>", "]]></short_desc>");
jaxbUnmarshaller.unmarshal(new StreamSource(new StringReader(xml)));
Обратите внимание, что обратный слеш \
должен быть экранирован в строке Java..
Исправление в java 9:
xml = xml.replaceAll("(?s)<short_desc>(.*)</short_desc>",
matchResult -> "<short_desc>"
+ StringEscapeUtils.escapeXml10(matchResult.group(1))
+ "</short_desc>");
или без общего языка Apache StringEscapeUtils:
xml = xml.replaceAll("(?s)<short_desc>(.*)</short_desc>",
matchResult -> "<short_desc>"
+ matchResult.group(1)
.replace("&", "&")
.replace("\"", """)
.replace("<", "<")
.replace(">", ">")
+ "</short_desc>");