2008-10-23 16 views
6

Bir DOM Belgesi oluşturmak için bir dosya okumaya çalışıyorum ama dosyada boşluk ve satır sonu var ve bunları görmezden gelmeye çalışıyorum. t: setIgnoringElementContentWhitespace yöntemi doğrulayarak bayrak etkin ama ben DTD veya belge için XML Şeması sahip olduğunda çalışır Javadoc görmekXML DOM oluşturmak için bir dosya okunurken boşluk nasıl göz ardı edilir?

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

.

Ne yapabilirim?

i var, fikrini sevmiyorum

Güncelleme ... kendim bildirimleri <! ELEMENT tanıtmak ve ben Tomalak tarafından işaret forum önerilen çözüm denedi ama çalışmıyor bir linux ortamında java 1.6 kullanılır. Ben artık niyorsa ı birkaç yöntemler boşluk metin düğümlerini

cevap

9

'IgnoringElementContentWhitespace' görmezden yapmak tüm saf boşluk metin düğümleri, Ebeveynleri sahip olarak şemada açıklanan ve sadece boşluk düğümler çıkarmadan ibaret değildir düşünüyorum ELEMENT içeriği - yani, sadece başka öğeler içerirler ve asla metin içermezler.

Kullanmakta olduğunuz bir şema (DTD veya XSD) yoksa, öğe içeriği varsayılan olarak MIXED (Karışık) olarak ayarlanır, bu nedenle bu parametrenin hiçbir zaman bir etkisi olmayacaktır. (Ayrıştırıcı, Java için mevcut olanları bildiğim kadarıyla, tüm bilinmeyen öğeleri ELEMENT içeriğine sahip olmak için standart dışı bir DOM uzantısı sağlamazsa).

Belgeyi yoldan kesebilirsiniz. şema bilgilerini dahil etmek için ayrıştırıcı, örneğin <! DOCTYPE ... [...]> <! ELEMENT ...> bildirimlerini içeren bir iç alt kümesi ekleyerek, ardından IgnoringElementContentWhitespace parametresini kullanın.

Veya, muhtemelen daha kolay bir şekilde, ya bir post-işlemde ya da bir LSParserFilter kullanarak geldikleri gibi, beyaz boşluk düğümlerini çıkartabilirsiniz.

+0

Sonunda sen bu o kadar çalışmaz las paragrafta – Telcontar

5

Bu (gerçekten) geç bir cevaptır, ama işte bu şekilde çözdüm. Bir NodeList sınıfının kendi uygulamasını yazdım. Sadece boş olan metin düğümlerini yok sayar. Kod aşağıdaki gibidir: Daha sonra bu sınıfta NodeList s her sarın ve etkili tüm boşluk düğümleri yok sayacaktır

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(); 
    } 
} 

. (Bu, 0 uzunlukta kesilmiş metin içeren Metin Düğümleri olarak tanımladığım).

Ayrıca, her bir döngü için kullanılabilmenin ek yararına sahiptir.

+0

önerdiğimiz gibi, programlama yoluyla gelen boşluklara görmezden zorunda Ayrıca gerçek düğümlerde boşluk ** içeriği ** yok sayar! – Strinder

+0

@Strinder Geri yorum yapamayacağınızı biliyorum (bunun için üzgünüm), ancak yalnızca beyaz boşluk olan herhangi bir 'düğümü' göz ardı etmeyi amaçladığımı bildirmek istedim. Benim uygulamamda, xmlimde hiçbir zaman anlamlı bir boşluk olmayacaktı. – jjnguy

+0

Basit bir nedenden dolayı whitespaces var: XML'in bir kısmını farklı bulduğum için bir XSD sağlayamıyorum - yani düğümler arasındaki boşluk ve boşluk içindeki boşluklar arasında fark edemediğim anlamına geliyor! Ancak şimdi sadece bu düğümleri görmezden geliyorum (farkın bir şekilde 'eksik' olduğunun bilinciyle). – Strinder

2

Ben Deneyin bu

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

yaparak çalışır yapılan bu:

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); 

    } 
İlgili konular