需要转义java中的XML标签(<,>,')之间存在的一些特殊字符

时间:2015-06-03 09:00:06

标签: java regex xml

我有一个XML字符串,它已存在于数据库中,但在解析此XML字符串时,我遇到了Parsing问题,因为我在XML标记之间有特殊字符,如(<,>,')。

我使用了名为StringEscapeUtils.escapeXml的API,但它也将转义xml标签。我不想转义xml标签。我想只转义标签值。

以下是我的xml字符串: -

<start>
<attribute name="resourcePageCategory"> <"there 'is' no category"></attribute>
<attribute name="resourceType" />
<attribute name="fairMarketValue">1000</attribute>
<attribute name="transferReason" />
<attribute name="effectiveDate" />
<attribute name="amountOwed">10</attribute>
</start>

预期输出应如下: -

<start>
    <attribute name="resourcePageCategory">  &lt; &quot;there &apos;is&apos; no category&quot;&gt;</attribute>
    <attribute name="resourceType" />
    <attribute name="fairMarketValue">1000</attribute>
    <attribute name="transferReason" />
    <attribute name="effectiveDate" />
    <attribute name="amountOwed">10</attribute>
    </start>

基本上它应该逃避xml标记之间存在的XML特殊字符,因为在我的代码中我发送这个xml用于解析 请给我任何示例代码来执行此操作。 如果我有任何正则表达式模式,我可以在String的replaceAll方法中使用,这是很好的。

另请注意,数据存储为数据库中的xml字符串。

1 个答案:

答案 0 :(得分:2)

public static String repair(String xml) {
    Pattern pattern = Pattern.compile("(<attribute name=\"[^\"]+\">)(.*?)(</attribute>)");
    Matcher m = pattern.matcher(xml);
    StringBuffer buf = new StringBuffer(xml.length() + xml.length() / 32);
    while (m.find()) {
        String escaped = StringEscapeUtils.escapeXml(m.group(2));
        m.appendReplacement(buf, m.group(1) + escaped + m.group(3));
    }
    m.appendTail(buf);
    return buf.toString();
}

.*?暂时不允许换行,为此添加DOTALL,并且急切(?)因此同一行上的两个属性确实被视为两个。