问答详情
源自:2-3 使用 DOM 解析XML 文件的节点名和节点值

有把老师最后的那个联系做了的吗?

有把老师最后的那个联系做了的吗?

提问者:网络小曦 2015-09-15 21:03

个回答

  • 码农_鑫森淼焱垚
    2015-09-16 18:07:49
    已采纳

    在3-4 中你会看到用SAX将XML文件存储在Book类中......那个比较容易理解

  • Zoya
    2016-04-20 10:27:37

    前提是我们不知道xml中的那些内容啊,要是所有属性都知道了,那叫我们解析xml文件的内容就没有意义了


  • 网络小曦
    2015-09-17 20:34:27

    //勉强写出来了,大家凑合看

    package com.lianxi.baochushujujiegou;


    import java.io.IOException;

    import java.io.ObjectInputStream.GetField;


    import javax.xml.parsers.DocumentBuilder;

    import javax.xml.parsers.DocumentBuilderFactory;

    import javax.xml.parsers.ParserConfigurationException;


    import org.w3c.dom.Document;

    import org.w3c.dom.NamedNodeMap;

    import org.w3c.dom.Node;

    import org.w3c.dom.NodeList;

    import org.xml.sax.SAXException;


    public class TextDOMXMLDemo {


    public static void main(String[] args) {

    book book1 = new book();

    book book2 = new book();

    //从 XML 文档获取生成 DOM 对象树的解析器

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();//newInstance()是一个静态方法,所以可以不创建对象就可以直接只用

    try {

    //使用当前配置的参数创建一个新的 DocumentBuilder 实例。

    DocumentBuilder db = dbf.newDocumentBuilder();

    /*

    * DocumentBuilder的定义:定义 API, 使其从 XML 文档获取 DOM 文档实例。使用此类,

    * 应用程序员可以从 XML 获取一个 Document。

    此类的实例可以从 DocumentBuilderFactory.newDocumentBuilder() 方法获取。

    获取此类的实例之后,将可以从各种输入源解析 XML。

    这些输入源有 InputStreams、Files、URL 和 SAX InputSources。

    * */

    try {

    //创建i,j,k,作为循环的变量,为了后边方便保存到book的对象中

    int i = 0;

    int j = 0;

    int k = 0;

    int flag = 0;//判断正在读第几本书

    //创建一个XML文件的根(Document 接口表示整个 HTML 或 XML 文档。从概念上讲,它是文档树的根,并提供对文档数据的基本访问。)

    Document docunment = db.parse("D:\\javaWorkHome\\XML(UTF-8)\\src\\books.xml");

    //获得标签名为book的节点的集合,并打印

    NodeList bookList = docunment.getElementsByTagName("book");

    System.out.println("获取到了"+bookList.getLength()+"本书");

    //遍历节点,开始访问节点内的元素

    for(i=0; i<bookList.getLength(); i++,flag++) {

    System.out.println("下面开始遍历第"+ (i+1) + "本书");

    System.out.println("============遍历开始============");

    //获取名为book的单个节点

    Node book = bookList.item(i);

    //获取该节点的所有属性图   属性指的是标签<>中的内容,是对标签的说明解释

    NamedNodeMap attrs = book.getAttributes();

    //遍历book的属性

    System.out.println("第"+(i+1)+"本书共有"+ attrs.getLength()+ "属性");

    for(j=0; j<attrs.getLength(); j++) {

    //获取book节点上的某一个属性

    Node attr = attrs.item(j);

    //输出属性名和属性值

    System.out.print("属性名为"+ attr.getNodeName());

    System.out.println(",属性值为"+ attr.getNodeValue());

    }

    //解析book节点的子节点

    NodeList childNodes = book.getChildNodes();

    System.out.println("第"+(i+1)+"本书共有"+childNodes.getLength()

    +"个子节点");//子节点包括<>标签和标签之间的空白和换行

    for(k=0; k<childNodes.getLength(); k++) {

    //区分出text类型的node以及element类型node

    if(childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {

    System.out.print("第"+k+"个元素,"+childNodes.item(k).getNodeName()+":");

    System.out.println(childNodes.item(k).getFirstChild().getNodeValue());

    }

    }

    System.out.println("============遍历结束============");

    //将从XML中读取的文件放在对象中

    switch (flag) {

    case 0:

    book1.setName(childNodes.item(1).getFirstChild().getNodeValue());

    book1.setAuthor(childNodes.item(3).getFirstChild().getNodeValue());

    book1.setYear(Integer.parseInt(childNodes.item(5).getFirstChild().getNodeValue()) );

    book1.setPrice(Double.parseDouble(childNodes.item(7).getFirstChild().getNodeValue()));

    break;


    case 1:

    book2.setName(childNodes.item(1).getFirstChild().getNodeValue());

    book2.setLanguage(childNodes.item(7).getFirstChild().getNodeValue());

    book2.setYear(Integer.parseInt(childNodes.item(3).getFirstChild().getNodeValue()) );

    book2.setPrice(Double.parseDouble(childNodes.item(5).getFirstChild().getNodeValue()));

    break;

    }

    }

    } catch (SAXException e) {

    // TODO 自动生成的 catch 块

    e.printStackTrace();

    } catch (IOException e) {

    // TODO 自动生成的 catch 块

    e.printStackTrace();

    }

    } catch (ParserConfigurationException e) {

    // TODO 自动生成的 catch 块

    e.printStackTrace();

    }//newDocumentBuilder()是一个抽象方法

    System.out.println(book1.getYear());

    System.out.println(book1.getAuthor());

    System.out.println(book1.getLanguage());

    System.out.println(book1.getPrice());

    System.out.println(book1.getYear());

    System.out.println(book2.getYear());

    System.out.println(book2.getAuthor());

    System.out.println(book2.getLanguage());

    System.out.println(book2.getPrice());

    System.out.println(book2.getYear());

    }


    }



  • 网络小曦
    2015-09-15 21:06:00

    创建book类,应该包含XML文件中所有的属性,然后每读到一本书的时候就创建一个book对象,并将其中的属性保存对相对应的对象属性中。然后将book对象最为集合保存起来。