删除XML字符元素中的重复换行符/制表符/空格

时间:2014-04-18 15:17:45

标签: java xml parsing sax

<node> test
    test
    test
</node>

我希望我的XML解析器读取<node>

中的字符
  1. 将换行符和制表符替换为空格,并将多个空格合并为一个空格。结果,文本应该类似于&#34;测试测试&#34;。
  2. 如果节点包含XML编码字符:标签(&#x9;),换行符(&#xA;)或空格(&#20;) - 则应将其留下。
  3. 我正在尝试下面的代码,但它会保留重复的空格。

      dbf = DocumentBuilderFactory.newInstance();
      dbf.setIgnoringComments( true );
      dbf.setNamespaceAware( namespaceAware );
      db = dbf.newDocumentBuilder();
      doc = db.parse( inputStream );
    

    以任何方式做我想做的事吗?

    谢谢!

1 个答案:

答案 0 :(得分:1)

第一部分 - 替换多个空格 - 相对容易,但我不认为解析器会为你做这些:

InputSource stream = new InputSource(inputStream);
XPath xpath = XPathFactory.newInstance().newXPath();
Document doc = (Document) xpath.evaluate("/", stream, XPathConstants.NODE);

NodeList nodes = (NodeList) xpath.evaluate("//text()", doc,
    XPathConstants.NODESET);
for (int i = 0; i < nodes.getLength(); i++) {
  Text text = (Text) nodes.item(i);
  text.setTextContent(text.getTextContent().replaceAll("\\s{2,}", " "));
}

// check results
TransformerFactory.newInstance()
    .newTransformer()
    .transform(new DOMSource(doc), new StreamResult(System.out));

这是困难的部分:

  

如果节点包含XML编码字符:标签(&#x9;),换行符(&#xA;)或空格(&#20;) - 它们应该保留。

解析器将始终将"&#x9;"转换为"\t" - 您可能需要编写自己的XML解析器。

According to的作者{p {3}}:

  

我认为任何XML解析器都不会报告应用程序的数字字符引用 - 它们将始终展开。实际上,您的应用程序不应该关心这一点,而不是关心属性之间有多少空格。