【问题标题】:Unescape XML tags only. Keep content escaped仅对 XML 标记进行转义。保持内容转义
【发布时间】:2021-10-14 14:08:56
【问题描述】:

我必须使用一个在 CDATA 标记内发送其 XML 数据的 WS,我得到的输出如下:

<parent>
    <child1>
        <xmltag1>4 años < 8 </xmltag1>
        <xmltag2>3 años < 12 </xmltag2>
    <child1>
</parent>

我必须将此数据格式化为可用的 XML,以便我可以使用它。

应该是这样的:

<parent>
    <child1>
        <xmltag1>4 años &lt; 8 </xmltag1>
        <xmltag2>3 años &lt; 12 </xmltag2>
    <child>
</parent>

我尝试过各种 java 函数,例如: StringEscapeUtils.unescapeXml(string);

我想可能有一种方法可以通过使用正则表达式来获得该结果

string.replaceAll("&lt;{0}>", "</{0}>");

【问题讨论】:

  • @WiktorStribiżew \\w 不会匹配像 &amp;lt;/xmltag1&gt; 这样的结束标签。
  • 看起来这个响应是一个 UTF-8 响应,但被读取为 ISO 8859-n。我假设años 应该是años
  • string.replace("&amp;lt;", "&lt;")?

标签: java regex


【解决方案1】:

你可以使用

String fixedXml = text.replaceAll("&lt;(/?\\w+(?:\\s[^>]*)?>)", "<$1");

请参阅regex demo详情

  • &amp;lt; - &amp;lt; 字符串
  • (/?\\w+(?:\\s[^&gt;]*)?&gt;) - 第 1 组 ($1):
    • /? - 一个可选的 / 字符
    • \w+ - 一个或多个单词字符
    • (?:\s[^&gt;]*)? - 一个可选的空白字符序列,然后是除&gt; 之外的任何零个或多个字符
    • &gt; - 一个 &gt; 字符。

【讨论】:

  • 这完全符合我的要求!有没有办法用 < 的次数来做到这一点
  • @DavidGonzálezArias 可能你的意思是.replaceAll("&amp;lt;(?=/?\\w+(?:\\s[^&gt;]*)?&gt;)", "&lt;")。或.replaceAll("(?:&amp;lt;)+(?=/?\\w+(?:\\s[^&gt;]*)?&gt;)", "&lt;").
猜你喜欢
  • 2010-09-06
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
  • 2022-09-24
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多