2008-10-23 51 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); 

    }