2008-10-23 52 views
6

我试图读取一个文件来生成一个DOM文档,但该文件有空白和换行符,我试图忽略它们,但是我不能' T:如何在读取文件时忽略空白以生成XML DOM

DocumentBuilderFactory docfactory=DocumentBuilderFactory.newInstance(); 
docfactory.setIgnoringElementContentWhitespace(true); 

我看到的Javadoc,只有当验证标志被启用,但是我没有DTD或文档的XML Schema setIgnoringElementContentWhitespace方法进行操作。

我该怎么办?

更新

我不喜欢的想法自我介绍<!ELEMENT ...声明和我试图通过托默勒格指向的forum提出的 解决方案,但它不工作,我有在linux环境下使用java 1.6。我想,如果没有更多的建议,我会做一些方法忽略空白文本节点

回答

9

“IgnoringElementContentWhitespace”是不是删除所有纯空白文本节点,只有空白节点的父母在模式中被描述为具有ELEMENT内容 - 也就是说,它们只包含其他元素,而不包含文本。

如果您没有使用架构(DTD或XSD),则元素内容默认为MIXED,所以此参数永远不会有任何影响。 (除非解析器提供一个非标准的DOM扩展来将所有未知元素视为包含ELEMENT内容,而据我所知,可用于Java的内容则不会)。

您可以在进入解析器包含架构信息,例如,通过向包含<!ELEMENT ...>声明的<!DOCTYPE ... [...]声明添加内部子集,然后使用IgnoringElementContentWhitespace参数。

或者,可能更简单,您可以在后处理中删除空白节点,或者在使用LSParserFilter时删除空白节点。

+0

我终于有编程忽略空格,就像你在拉斯维加斯款 – Telcontar 2008-10-25 08:02:10

5

这是一个(真的)迟到的答案,但这里是我如何解决它。我写了我自己的NodeList类的实现。它只是忽略空的文本节点。代码如下:

private static class NdLst implements NodeList, Iterable<Node> { 

    private List<Node> nodes; 

    public NdLst(NodeList list) { 
     nodes = new ArrayList<Node>(); 
     for (int i = 0; i < list.getLength(); i++) { 
      if (!isWhitespaceNode(list.item(i))) { 
       nodes.add(list.item(i)); 
      } 
     } 
    } 

    @Override 
    public Node item(int index) { 
     return nodes.get(index); 
    } 

    @Override 
    public int getLength() { 
     return nodes.size(); 
    } 

    private static boolean isWhitespaceNode(Node n) { 
     if (n.getNodeType() == Node.TEXT_NODE) { 
      String val = n.getNodeValue(); 
      return val.trim().length() == 0; 
     } else { 
      return false; 
     } 
    } 

    @Override 
    public Iterator<Node> iterator() { 
     return nodes.iterator(); 
    } 
} 

然后你换你所有的NodeList S在这一类,它会有效地忽略所有的空白节点。 (我将其定义为具有长度为0的修剪文本的文本节点。)

它还具有能够在for-each循环中使用的附加好处。

+0

表明这并不因为它的工作也忽略了真实节点中的空白**内容**! – Strinder 2012-02-09 15:46:09

2

我把它的工作原理是这样

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
     dbFactory.setIgnoringElementContentWhitespace(true); 
     dbFactory.setSchema(schema); 
     dbFactory.setNamespaceAware(true); 
NodeList nodeList = element.getElementsByTagNameNS("*", "associate"); 
0

试试这个:

private static Document prepareXML(String param) throws ParserConfigurationException, SAXException, IOException { 

     param = param.replaceAll(">\\s+<", "><").trim(); 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     factory.setIgnoringElementContentWhitespace(true); 
     DocumentBuilder builder = factory.newDocumentBuilder(); 
     InputSource in = new InputSource(new StringReader(param)); 
     return builder.parse(in); 

    }