从XML样式的字符串中删除无效字符

时间:2019-06-06 03:17:24

标签: java xml

我正在创建一个Web服务,该服务接收字符串并将其转换为XML。 XML创建是通过java dom4j完成的。字符串的格式如下:

<form01><Textbox1 id="Textbox1" dataType="java.lang.String" perDataProId="">Site1</Textbox1><Textbox2 id="Textbox2" dataType="java.lang.String" perDataProId="">Site1</Textbox2></form01>

为避免XML无效字符,我想可以使用StringReader读取字符串并删除&,但我想知道如何删除<和>?例如,如果输入字符串为

<form01><Textbox1 id="Textbox1" dataType="java.lang.String" perDataProId="">Site<1</Textbox1><Textbox2 id="Textbox2" dataType="java.lang.String" perDataProId="">Site1</Textbox2></form01>

如何在保留“ Site <1”中的“ <”的同时让其他人喜欢? 有什么建议吗?

2 个答案:

答案 0 :(得分:0)

通常,在XML DOM中设置文本或稍后再获取时,XML API会很小心。

某些字符将转换为XML实体:< > " ' &

在某些XML版本中也有some Characters not allowed,例如\u0000

apache.commons.lang有一个StringEscapeUtils.escapeXML,如果您需要自己以纯文本格式进行转换。

答案 1 :(得分:0)

您可以使用以下RegExp:

  public static void main(String[] args)
  {
    String str = "<form01><Textbox1 id=\"Textbox1\" dataType=\"java.lang.String\" perDataProId=\"\">Site<1</Textbox1><Textbox2 id=\"Textbox2\" dataType=\"java.lang.String\" perDataProId=\"\">Site1>a</Textbox2><Textbox3 id=\"Textbox2\" dataType=\"java.lang.String\" perDataProId=\"\">Site1&</Textbox3></form01>";
    System.out.println(str.replaceAll("(>[^<>]*)<([^<>]*<\\/)", "$1&lt;$2"));
    System.out.println(str.replaceAll("(>[^<>]*)>([^<>]*<\\/)", "$1&gt;$2"));
    System.out.println(str.replaceAll("(>[^<>]*)\\&([^<>]*<\\/)", "$1&amp;$2"));
  }

结果:

<form01><Textbox1 id="Textbox1" dataType="java.lang.String" perDataProId="">Site&lt;1</Textbox1><Textbox2 id="Textbox2" dataType="java.lang.String" perDataProId="">Site1>a</Textbox2><Textbox3 id="Textbox2" dataType="java.lang.String" perDataProId="">Site1&</Textbox3></form01>
<form01><Textbox1 id="Textbox1" dataType="java.lang.String" perDataProId="">Site<1</Textbox1><Textbox2 id="Textbox2" dataType="java.lang.String" perDataProId="">Site1&gt;a</Textbox2><Textbox3 id="Textbox2" dataType="java.lang.String" perDataProId="">Site1&</Textbox3></form01>
<form01><Textbox1 id="Textbox1" dataType="java.lang.String" perDataProId="">Site<1</Textbox1><Textbox2 id="Textbox2" dataType="java.lang.String" perDataProId="">Site1>a</Textbox2><Textbox3 id="Textbox2" dataType="java.lang.String" perDataProId="">Site1&amp;</Textbox3></form01>

无论如何,我都会考虑使用Guava HtmlEscapers。这种情况下的RegExp开销很小。