Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java解析器从xml获取属性时出错_Java_Xml - Fatal编程技术网

使用java解析器从xml获取属性时出错

使用java解析器从xml获取属性时出错,java,xml,Java,Xml,我有以下代码: Libreria.java package libreriaparser; public class Libreria { public static void main(String[] args) { Parser parser=new Parser(); parser.parseFicheroXml("biblioteca.xml"); parser.parseDocument(); parser

我有以下代码:

Libreria.java

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

}
Parser.java

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文件中读取任意属性。如果我从libro.java和getLibro中删除anyo,程序运行正常。但是我需要阅读这个属性。这是我学校的工作,我不知道我做错了什么。谢谢。

anyo属性属于titulo元素。在代码中,取而代之的是从libro节点获取其值

只需在表示titulo的元素上调用getAttribute,方法与通过方法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);