2009-06-10 6 views
2

J'ai écrit class pour analyser du xml dans un objet et ça ne fonctionne pas correctement, quand j'essaye d'obtenir la valeur d'un nœud, je reçois un zéro plutôt que le contenu du nœud.Pourquoi ce code java n'analyse-t-il pas correctement mon XML?

Voici une version simplifiée de ma classe qui fait juste l'analyse syntaxique xml d'un seul nœud:

import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 

import org.apache.log4j.Logger; 
import org.apache.log4j.xml.DOMConfigurator; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import org.xml.sax.SAXException; 

public class XmlReaderCutDown { 

    private static Logger logger = Logger.getLogger(CtiButtonsXmlReader.class); 

    public static void testXml(String confFile){ 
     DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); 
     try { 
      DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); 
      Document doc = docBuilder.parse(new File(confFile)); 
      doc.getDocumentElement().normalize(); 
      if (logger.isDebugEnabled()){ 
       logger.debug("The root element is " + doc.getDocumentElement().getNodeName()); 
      } 

      NodeList rows = doc.getElementsByTagName("row"); 

      NodeList topRowButtons = ((Element)rows.item(0)).getElementsByTagName("button"); 
      logger.debug("Top row has " +topRowButtons.getLength() + " items."); 
      Node buttonNode = topRowButtons.item(0); 

      NodeList nodeList = ((Element)buttonNode).getElementsByTagName("id"); 
      logger.debug("Node list count for "+ "id" + " = " + nodeList.getLength()); 
      Element element = (Element)nodeList.item(0); 
      String xx = element.getNodeValue(); 
      logger.debug(xx); 
      String elementValue = ((Node)element).getNodeValue(); 
      if (elementValue != null) { 
       elementValue = elementValue.trim(); 
      } 
      else { 
       logger.debug("Value was null"); 
      } 
      logger.debug("Node id = "+ elementValue); 

     } catch (ParserConfigurationException e) { 

      logger.fatal(e.toString(),e); 
     } catch (SAXException e) { 
      logger.fatal(e.toString(),e); 
     } catch (IOException e) { 
      logger.fatal(e.toString(),e); 
     } catch (Exception e) { 
      logger.fatal(e.toString(),e); 
     } 

    } 


    public static void main(String[] args){ 
     DOMConfigurator.configure("log4j.xml"); 

     testXml("test.xml"); 
    } 
} 

Et voici une version dépouillée de mon fichier xml:

<?xml version="1.0"?> 
<root> 
    <row> 
     <button> 
      <id>this is an id</id> 
      <action>action</action> 
      <image-src>../images/img.png</image-src> 
      <alt-text>alt txt</alt-text> 
      <tool-tip>Tool tip</tool-tip> 
     </button> 
    </row> 
</root> 

Cette est ce que la sortie de statments exploitation forestière:

DEBUG XmlReaderCutDown - l'élément racine est la racine

DEBUG XmlReaderCutDown - La ligne du haut contient 1 éléments.

DEBUG XmlReaderCutDown - Dépouillement liste de noeuds pour id = 1

DEBUG XmlReaderCutDown -

DEBUG XmlReaderCutDown - Valeur était nulle

DEBUG XmlReaderCutDown - Noeud id = null

Pourquoi pas il obtient le texte dans le noeud xml?

Je suis en utilisant 1.6_10 JDK

+0

Remarque si vous voulez l'essayer, mais n'avez pas log4j vous pouvez remplacer les statments de journalisation avec système .out.println(); –

Répondre

6

Parce que l'élément que vous obtenez est l'élément parent du texte un, contenant le texte dont vous avez besoin. Pour accéder au texte de cet élément, vous devez utiliser getTextContent au lieu de getNodeValue.

Pour plus d'informations, reportez-vous au tableau du fichier javadoc Node.

+0

Merci qui fonctionne un charme, une question cependant pourquoi le code sur cette page http://www.java-tips.org/java-se-tips/javax.xml.parsers/how-to-read-xml-file -in-java.html fonctionne quand il utilise la valeur de noeud? –

+0

Parce qu'ils obtiennent le premier enfant de l'élément en question, qui est le nœud de texte. C'est globalement la même chose que fait getTextContent, seulement plus sûr dans le cas de getTextContent. –

+0

Vous pouvez utiliser nodeValue() sur un noeud Text. –

1

Pensez à utiliser XPath comme une alternative aux noeuds marche manuellement:

public static void testXml(String confFile) 
     throws XPathExpressionException { 
    XPathFactory xpFactory = XPathFactory.newInstance(); 
    XPath xpath = xpFactory.newXPath(); 

    NodeList rows = (NodeList) xpath.evaluate("root/row", 
     new InputSource(confFile), XPathConstants.NODESET); 

    for (int i = 0; i < rows.getLength(); i++) { 
     Node row = rows.item(i); 
     String id = xpath.evaluate("button/id", row); 
     System.out.println("id=" + id); 
    } 
    } 

    public static void main(String[] args) 
     throws XPathExpressionException { 
    testXml("test.xml"); 
    } 
Questions connexes