2012-07-25 17 views
6

Aşağıdaki xml dosyası vardır: Java Dom ayrıştırıcı alt düğümlerin sayısı yanlış bildiriyor

<?xml version="1.0" encoding="UTF-8"?> 
<users> 
<user id="0" firstname="John"/> 
</users> 

Sonra java ile ayrıştırmak çalışıyorum, ancak getchildnodes çocuk düğümlerin yanlış sayısını bildirir.

Java kodu:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
Document document = builder.parse(this.file); 
document.getDocumentElement().normalize(); 
Element root = document.getDocumentElement(); 
NodeList nodes = root.getChildNodes(); 
System.out.println(nodes.getLength()); 

Sonuç: 3

Ayrıca ben düğümleri erişmek için NPEs alıyorum nitelikleri, bu yüzden bir şey tahmin ediyorum korkunç bir yanlış gidiyor.

cevap

3

üç alt düğümleri vardır:

  • bir satır sonu
  • bir eleman düğümü (etiketli kullanıcı) ihtiva eden bir metin düğümü
  • bir satır sonu
içeren bir metin düğümü

Çocuk düğümlerini işlerken, öğe düğümlerini kontrol edin.

+4

Teşekkürler, yalnızca genel bir şekilde öğeleri filtrelemek için bir yol biliyor musunuz? –

4

Alt düğümleri, boşluklar için öğeler ve metin düğümlerinden oluşur. Nitelikler işlenmeden önce düğüm tipini kontrol etmek isteyeceksiniz. Ayrıca Java SE 5.

Örnek Bu örnek, bir DOM karşı bir XPath bir açıklamada bulunması gösterilmiştir 1

ile başlayan JDK/JRE mevcut javax.xml.xpath API'leri kullanarak düşünebilirsiniz.

package forum11649396; 

import java.io.StringReader; 
import javax.xml.parsers.*; 
import javax.xml.xpath.*; 
import org.w3c.dom.*; 
import org.xml.sax.InputSource; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     String xml = "<?xml version='1.0' encoding='UTF-8'?><users><user id='0' firstname='John'/></users>"; 

     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     Document document = db.parse(new InputSource(new StringReader(xml))); 

     XPathFactory xpf = XPathFactory.newInstance(); 
     XPath xpath = xpf.newXPath(); 
     Element userElement = (Element) xpath.evaluate("https://stackoverflow.com/users/user", document, XPathConstants.NODE); 
     System.out.println(userElement.getAttribute("id")); 
     System.out.println(userElement.getAttribute("firstname")); 
    } 

} 

Örnek 2

Aşağıdaki örnek bir DOM düğümü almak için InputSource karşı bir XPath bildiri yayınlaması gösterilmiştir. Bu, XML'i DOM'a kendiniz ayırmaktan kurtarır.

package forum11649396; 

import java.io.StringReader; 
import javax.xml.xpath.*; 
import org.w3c.dom.*; 
import org.xml.sax.InputSource; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     String xml = "<?xml version='1.0' encoding='UTF-8'?><users><user id='0' firstname='John'/></users>"; 

     XPathFactory xpf = XPathFactory.newInstance(); 
     XPath xpath = xpf.newXPath(); 
     InputSource inputSource = new InputSource(new StringReader(xml)); 
     Element userElement = (Element) xpath.evaluate("https://stackoverflow.com/users/user", inputSource, XPathConstants.NODE); 
     System.out.println(userElement.getAttribute("id")); 
     System.out.println(userElement.getAttribute("firstname")); 
    } 

} 
1

Metin düğümleri için sayılan düğümler arasında '\ n' hesabını yaptığınızdan emin olmanız gerekir. Ben özelliklerini erişmeye çalışırken NPES ilgili son bir not ele cevapları birini fark etmedi Sen if(root.getNodeType() == Node.ELEMENT_NODE)

 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder = factory.newDocumentBuilder(); 
     Document document = builder.parse(this.file); 
     document.getDocumentElement().normalize(); 
     for(Node root = document.getFirstChild(); root != null; root = root.getNextSibling()) { 
      if(root.getNodeType() == Node.ELEMENT_NODE) { 
       NodeList nodes = root.getChildNodes(); 
       System.out.println(root.getNodeName() + " has "+nodes.getLength()+" children"); 
       for(int i=0; i<nodes.getLength(); i++) { 
        Node n = nodes.item(i); 
        System.out.println("\t"+n.getNodeName()); 
       } 
      } 
     } 
0

kullanarak bunun için test edebilirsiniz.

Ayrıca, düğümler niteliklerine erişmek için NPE alıyorum, bu yüzden bir şeyin korkunç bir şekilde yanlış gittiğini tahmin ediyorum. ,

düğümleri her zaman myProp özelliği içeriyorsa çalışıyor
String myPropValue = node.getAttributes().getNamedItem("myProp").getNodeValue(); 

:

Birkaç sitelerde aşağıdaki öneri görmeniz yana

, bunu niteliklere erişmek için ortak bir yol olduğunu varsayalım ancak öznitelikleri yoksa, getAttributes boş döndürür.Ayrıca, nitelikler varsa, ancak myProp özniteliği varsa, getNamedItem boş döndürür.

Şu anda bir yarar sınıfında

public static String getStrAttr(Node node, String key) { 
    if (node.hasAttributes()) { 
     Node item = node.getAttributes().getNamedItem(key); 
     if (item != null) { 
      return item.getNodeValue(); 
     } 
    } 

    return null; 
} 

public static int getIntAttr(Node node, String key) { 
    if (node.hasAttributes()) { 
     Node item = node.getAttributes().getNamedItem(key); 
     if (item != null) { 
      return Integer.parseInt(item.getNodeValue()); 
     } 
    } 

    return -1; 
} 

kullanıyorum, ancak kilometre değişebilir.