代码之家  ›  专栏  ›  技术社区  ›  ryanprayogo

替换格式不正确的XML正文中的字符

  •  1
  • ryanprayogo  · 技术社区  · 14 年前

    在我正在编写的(Java)代码中,我有时处理一个非良好格式的XML(表示为Java) String

    <root>
      <foo>
        bar & baz < quux
      </foo>
    </root>
    

    由于这个XML最终需要被解组(使用JAXB),显然这个XML原样在解组时会抛出异常。

    & 以及 < 它的角色实体?为了 &

    xml.replaceAll("&", "&amp;")
    

    < 符号,这有点棘手,因为显然我不想替换 < 用于XML标记开头的“bracket”。

    除了扫描字符串和手动替换 < 在XML正文中 &lt; ,您还有什么建议?

    3 回复  |  直到 14 年前
        1
  •  4
  •   Paul Clapham    14 年前

    由于不需要XML解析器来处理格式错误的XML,因此您的解析器也不需要这样做。别这么做。

        2
  •  1
  •   Koen    14 年前

    我想你需要更先进的逻辑。最好首先使用“(<[^>]+>)“并且只替换那些匹配项之外的文本,但是很明显,您将无法使用replaceAll方法。这将是一个管道工程。。。

        3
  •  1
  •   cdeszaq Sudhir N    13 年前

    虽然这是一个老帖子,但我认为它可能会帮助其他人..我有同样的要求/问题,我可以解决使用以下代码。

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    
    public class XMLTest {
    
    /**
    * @param args
    */
    
    public static void main(String[] args) {
    
    String xml = "<xml><body>" +
    "<message>something < between <<<  somthing </message>" +
    "<text> testing  >> > testing </text>" +
    "</body></xml>";
    
    Pattern replaceGTPattern = Pattern.compile(">[^<](.[^<]*)(>)+");
    
    Matcher m = replaceGTPattern.matcher(xml);
    
    String replacement;
    StringBuffer intermXml = new StringBuffer();
    
    
    while(m.find()){
    
        replacement = ">"+m.group(0).substring(1).replaceAll(">", ";&gt");
    
    
        m.appendReplacement(intermXml,replacement);
    
    
        }
    
    
        m.appendTail(intermXml);
    
    Pattern replaceLTPattern = Pattern.compile("<(.[^>]*)(<)+");
    
    m = replaceLTPattern.matcher(intermXml);
    
    StringBuffer finalXml = new StringBuffer();
    
    while(m.find()){
    
        replacement = m.group(0).substring(0,m.group(0).length()-1).replaceAll("<", ";&lt").concat("<");
    
    
        m.appendReplacement(finalXml,replacement);
    
    
        }
    
        m.appendTail(finalXml);
    
        System.out.println(finalXml);
    
    }
    }