2017-06-04 78 views
1

我想转义字符串中的XML特殊字符。如下所示,通过静态方法处理转义。如何避免在JAVA中重复分析XML特殊字符

public static String escapeXml10(String response) { 
    return StringEscapeUtils.escapeXml10(response); 
} 

现在这个实现的问题是,我得到一块字符串,可能会或可能不会被解析。这导致不规则的输出。

为例如:

  1. & - > &安培(该字符串不被解析遵循不同的流量)
  2. & - > &安培; (这个字符串被流解析一次,现在被我的代码解析)。

现在为了得到正确的回应,我打算在静态metod中引入一个检查。通过使用条件如下所示。

public static String escapeXml10(String response) { 
    if(response.contains("&") || 
      response.contains("<") || 
      response.contains(">") || 
      response.contains("'") || 
      response.contains(""")){ 
      return response; 
     }else{ 
      return StringEscapeUtils.escapeXml10(response);  
     } 
} 

这是一个正确的执行方式,如果不是请建议?

+2

那么,你传递的不是XML的东西到XML解析器?为什么你首先做到这一点?问题在于你的流程。你应该不必这么做:它显示了一个设计问题。 –

+0

@JBNizet,我正在形成一个来自UI的输入,这些值被带入xml,然后被赋予一个流程引擎。用户界面可能像浏览器,命令行和少数应用程序。现在,这部分代码是一个接口,它负责将输入转换为流程引擎能够理解的格式。我认为这不是一个设计问题。如果不是,请纠正我。 – User27854

+0

因此,如果我明白了,您将从浏览器获得输入,并将其转换为用于流程引擎的XML。而且你正在对来自命令行,app1,app2等的输入做同样的处理。所以最后,每个输入都应该是XML,适合流程引擎。那么,为什么你必须逃避任何事情,为什么结果有时会被解析,有时甚至没有。 –

回答

1
  • 1:你正在做的是escapping,不解析
  • 第二:@JBNizet是对的:这里有一个设计问题。您需要必须知道您应该在您的输入参数中收到什么类型的数据:weteher它是一个溢出的,有效的XML或无限制的XML。
  • 第三:作为一般规则,所有用户数据应当由程序在其普通-unformatted-形式处理,并且具有最具体的数据类型:int为整数,floatdouble为小数,String为文本等 然后,一个适当的格式应该完成只是在序列化该数据。例如,在序列化为XML之前,必须正确放置节点和属性以形成特定的数据结构,并且必须对用户数据进行转义以避免发生特殊字符。相反,在阅读XML(=解析)时,必须完成一个未翻转(但这已经由解析器完成)。

Conclussion:你不应该甚至如果你使用标准的XML解析器(DocumentBuilderFactorySAXParserXMLInputFactory)和串行器(TransformerFactoryXMLOutputFactory)escapping在意。也不应该关心你的客户端应用程序。