簡體   English   中英

使用Java解析器從XML獲取屬性時出錯

[英]Error getting attribute from xml with java parser

我有以下代碼:

庫文件

package libreriaparser;

public class Libreria {

    public static void main(String[] args) {

        Parser parser=new Parser();
        parser.parseFicheroXml("biblioteca.xml");
        parser.parseDocument();
        parser.print();

    }

}

Libro.java

package libreriaparser;

import java.io.Serializable;

//Defino el objeto tipo libro que contiene título, autor, año, editor y número de páginas.
public class Libro implements Serializable {

    private String titulo=null;
    private String autor=null;
    private int anyo=0;
    private String editor=null;
    private int paginas=0;

    //Incluyo dos contructores y los métodos get y set necesarios
    public Libro() {
    }

    public Libro(String t, String a, int y, String e, int j) {
        titulo = t;
        autor = a;
        anyo = y;
        editor = e;
        paginas = j;
    }

    public String getTitulo() {
        return titulo;
    }

    public String getAutor() {
        return autor;
    }

    public int getAnyo() {
        return anyo;
    }

    public String getEditor() {
        return editor;
    }

    public int getPaginas() {
        return paginas;
    }

    public void setTitulo(String t) {
        titulo = t;
    }

    public void setAutor(String a) {
        autor = a;
    }

    public void setAnyo(short an) {
        anyo = an;
    }

    public void setEditor(String e) {
        editor = e;
    }

    public void setPaginas(short p) {
        paginas = p;
    }

    //Defino un método print para mostrar los libros por consola
    public void print(){
        System.out.println("Título: "+titulo+". Autor: "+autor+". Editor: "+editor+". Número de páginas: "+paginas);
    }

}

解析器

package libreriaparser;

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

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

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class Parser {

    private Document dom = null;
    private ArrayList<Libro> libros = null;

    public Parser() {
        libros = new ArrayList<Libro>();
    }

    public void parseFicheroXml(String fichero) {
        // creamos una factory
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        // Creamos un documentbuilder
        DocumentBuilder db;

        try {
            db = dbf.newDocumentBuilder();
            // parseamos el XML y obtenemos una representación DOM
            dom = db.parse(fichero);
        } catch (ParserConfigurationException pce) {
            pce.printStackTrace();
        } catch (SAXException se) {
            se.printStackTrace();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }

    }

    public void parseDocument() {
        // obtenemos el elemento raíz
        Element docEle = dom.getDocumentElement();

        // obtenemos el nodelist de elementos
        NodeList nl = docEle.getElementsByTagName("libro");
        if (nl != null && nl.getLength() > 0) {
            for (int i = 0; i < nl.getLength(); i++) {

                // obtenemos un elemento de la lista (libro)
                Element el = (Element) nl.item(i);

                // obtenemos un libro
                Libro l1 = getLibro(el);

                // lo añadimos al array
                libros.add(l1);
            }
        }
    }

    private Libro getLibro(Element libroEle){

        //para cada elemento libro, obtenemos su título, autor, año, editor y páginas
        String titulo = getTextValue(libroEle,"titulo");
        String autor = getTextValue(libroEle,"autor");
        // Leemos el atributo año que va metido dentro del título del libro
        String anyoString = libroEle.getAttribute("anyo");
        int anyo = Integer.parseInt(anyoString);
        String editor = getTextValue(libroEle,"editor");
        int paginas = getIntValue(libroEle,"paginas");



        //Creamos un nuevo libro con los elementos leídos del nodo
        Libro l2 = new Libro(titulo, autor, anyo, editor, paginas);

        return l2;      

    }

    private String getTextValue(Element ele, String tagName) {
        String textVal = null;
        NodeList nl = ele.getElementsByTagName(tagName);
        if(nl != null && nl.getLength() > 0) {
            Element el = (Element)nl.item(0);
            textVal = el.getFirstChild().getNodeValue();
        }       
        return textVal;
    }

    private int getIntValue(Element ele, String tagName) {              
        return Integer.parseInt(getTextValue(ele,tagName));
    }

    public void print(){

        Iterator it = libros.iterator();
        while(it.hasNext()) {
            Libro l3=(Libro) it.next();
            l3.print();
        }
    }



}

Biblioteca.xml

<?xml version="1.0" encoding="UTF-8"?>
<biblioteca>
    <libro>
        <titulo anyo="2008">Introduction to Linux</titulo>
        <autor>Machtelt &amp; Garrels</autor>
        <editor>O'Reilly</editor>
        <paginas>256</paginas>
    </libro>
    <libro>
        <titulo anyo="1991">El lenguaje de programación C</titulo>
        <autor>Kernighan &amp; Ritchie</autor>
        <editor>Prentice Hall</editor>
        <paginas>294</paginas>
    </libro>
</biblioteca>

我的問題是:我無法從xml文件讀取屬性“ anyo”。 如果我從libro.java和getLibro中刪除“ anyo”,則程序運行正常。 但是我需要閱讀此屬性。 這是我學校的工作,我不知道自己做錯了什么。 謝謝。

anyo屬性屬於titulo元素。 在代碼中,您將從libro節點獲取其值。

只需在表示titulo的元素上調用getAttribute (與通過getTextValue方法獲取節點的方式getTextValue ):

String anyoString = "0";
NodeList nl = libroEle.getElementsByTagName("titulo");
if(nl != null && nl.getLength() > 0) {
   Element el = (Element)nl.item(0);
   anyoString = el.getAttribute("anyo");
}       
int anyo = Integer.parseInt(anyoString);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM