原 Java学习之Xml系列二:xml按条件查询、xml递归遍历所有元素和属性

xml中加入了几条,为了方便查询时作为示例。

话不多说见代码注释:

DTD文件:SwordTypeDefinition.dtd

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT SwordLibrary (Sword*)>
<!ELEMENT Sword (SwordName,Price,Attack)>
<!ELEMENT SwordName (#PCDATA)>
<!ELEMENT Price (#PCDATA)>
<!ELEMENT Attack (#PCDATA)>
<!ATTLIST Sword sno CDATA #REQUIRED>
<!ATTLIST Price type CDATA #IMPLIED>
<!ATTLIST Attack factor CDATA "1.0">

XML文件:SwordLib.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE SwordLibrary SYSTEM "SwordTypeDefinition.dtd">
<SwordLibrary>
<Sword sno=‘s1‘>
<SwordName>欢欣之刃</SwordName>
<Price>1000</Price>
<Attack>10</Attack>
</Sword>
<Sword sno=‘s2‘>
<SwordName>夜叉</SwordName>
<Price>2050</Price>
<Attack factor="2.0">30</Attack>
</Sword>
<Sword sno=‘s3‘>
<SwordName>魔棒</SwordName>
<Price type="Dollar">200</Price>
<Attack>0</Attack>
</Sword>
</SwordLibrary>

java代码:

package JavaLeaner.XmlTest;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

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

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

public class XmlDemo2 {

    /*
     * 按照属性sno查询
     */
    @Test
    public void Test1() throws IOException, ParserConfigurationException, SAXException 
    {
        System.out.println("请输入查找的sword的sno:");
        //这里是java 的控制台输入方法,老忘记,TT
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String sno=br.readLine();
        Element st= FindSwordBySno(sno);
        if (st != null) {
            String sname = st.getElementsByTagName("SwordName").item(0).getTextContent();
            System.out.println("此剑为:" + sname);
        }
        else
        {
            System.out.println("这里不卖!!" );
        }
        
/*        请输入查找的sword的sno:
        s2
        此剑为:夜叉
        */
    }
    
    Element FindSwordBySno(String sno)throws ParserConfigurationException, SAXException, IOException
    {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docDuilder = factory.newDocumentBuilder();
        Document doc = docDuilder.parse("src/JavaLeaner/XmlTest/SwordLib.xml");
        NodeList list = doc.getElementsByTagName("Sword");
        for(int i=0;i<list.getLength();i++)
        {
            Element swordTag=(Element)list.item(i);
            String snoText=swordTag.getAttribute("sno");
            if(snoText.equals(sno))
            {
                return swordTag;
            }
        }
        return null;
    }
    
    
    /*
     * 递归遍历整个xml文档的元素和属性
     */
    @Test
    public void Test2() throws IOException, ParserConfigurationException, SAXException 
    {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docDuilder = factory.newDocumentBuilder();
        Document doc = docDuilder.parse("src/JavaLeaner/XmlTest/SwordLib.xml");
        //取文档根元素
        Element rootElement= doc.getDocumentElement();
        String rootName = rootElement.getTagName();
        System.out.println(rootName);
        DeepIn(rootElement);
        

    }
    
    void DeepIn(Element parentElement)
    {
        NodeList list=parentElement.getChildNodes();
        for(int i=0;i<list.getLength();i++)
        {
            if (list.item(i) instanceof Element) {
                Element nodeElement = (Element) list.item(i);
                String eName = nodeElement.getNodeName();
                System.out.println(eName);
                NamedNodeMap nnm=nodeElement.getAttributes();
                //注意:NamedNodeMap也不支持java.lang.Iterable,所以不能增强佛如循环
                for(int j=0;j<nnm.getLength();j++)
                {
                    String aName = nnm.item(j).getNodeName();
                    String aText = nnm.item(j).getTextContent();
                    System.out.println("    "+aName+"="+aText);
                }
                DeepIn(nodeElement);
            }
            else
            {
                //System.out.println("not Element:"+list.item(i).getTextContent()+"------");
/*                注意: getChildNodes()获取的不仅仅包括子元素,还包括其他的字符串等文本,这里之所以会出现这些not Element:-----,是因为xml文件中有许多空白符和换行的缘故
 *                 在实际使用中,可以像本例一样用instanceof Element的条件判断将这些东西过滤掉。
 *                 这个结果不包含属性部分的代码:
 *                 SwordLibrary
                not Element:
                ------
                Sword
                not Element:
                ------
                SwordName
                not Element:欢欣之刃------
                not Element:
                ------
                Price
                not Element:1000------
                not Element:
                ------
                Attack
                not Element:10------
                not Element:
                ------
                not Element:
                ------
                Sword
                not Element:
                ------
                SwordName
                not Element:夜叉------
                not Element:
                ------
                Price
                not Element:2050------
                not Element:
                ------
                Attack
                not Element:30------
                not Element:
                ------
                not Element:
                ------
                Sword
                not Element:
                ------
                SwordName
                not Element:魔棒------
                not Element:
                ------
                Price
                not Element:200------
                not Element:
                ------
                Attack
                not Element:0------
                not Element:
                ------
                not Element:
                ------*/

            }
    
        }
/*        结果:
 * 
 *         SwordLibrary
        Sword
            sno=s1
        SwordName
        Price
        Attack
            factor=1.0
        Sword
            sno=s2
        SwordName
        Price
        Attack
            factor=2.0
        Sword
            sno=s3
        SwordName
        Price
            type=Dollar
        Attack
            factor=1.0*/

    }
    
    
    
}

原 Java学习之Xml系列二:xml按条件查询、xml递归遍历所有元素和属性

时间: 2024-08-23 23:36:55

原 Java学习之Xml系列二:xml按条件查询、xml递归遍历所有元素和属性的相关文章

Java学习之Xml系列五:SAX解析——搜索xml内容

本文对SAX解析进一步说明. 另外主要给利用SAX解析方法找到指定条件(如标签名称)的xml文档内容. 首先按需要介绍一下DefaultHandler. DefaultHandler类是SAX2事件处理程序的默认基类.它继承了EntityResolver.DTDHandler.ContentHandler和ErrorHandler这四个接口.包含这四个接口的所有方法,所以我们在编写事件处理程序时,可以不用直接实现这四个接口,而继承该类,然后重写我们需要的方法.(注意:ContentHandler

Silverlight 使用IsolatedStorage新建XML文件,并且用LINQ查询XML

代码 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->using System; using System.Linq; using System.Windows.Shapes; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO

Java学习之路(二)--Thinking in Java

针对昨天Java学习之路(一)--Thinking in Java中的类的静态方法不能访问创建非静态类,给出了将内部类修改成为static静态类,操作方便简单.现在给出第二种不需要添加删除的另一种极为高效的方式.可以将内部类从你所创建的类中复制粘贴到类外,作为一个外部类,在static主方法中就可以创建类的引用了. 源代码如下: ? class test{ int s; char c; } public class test1 { public static class test{ int s;

Java学习不走弯路教程(3.从文件内容查询开始)

从文件查询开始 一. 前言在前两章教程中,分别介绍了DOS环境搭建和Eclipse环境搭建.本章将带大家实现用简单SQL语句查询文件.注:1.本文针对初学Java的同学训练学习思路,请不要太纠结于细节问题.2.本文旨在达到抛砖引玉的效果,希望大家扩展本例子,以学到更多知识的精髓. 二. 写给初学Java的同学在介绍本章内容之前,首先介绍一下Java的学习方法.相信大家在看本文的时候已经已经拿到了各种Java学习路径,大体都是一样.我想说的是,不要让知识的学习成为负担,Java技术种类繁多,是无论

JAVA学习第五十二课 — IO流(六)File对象

File类 用来给文件或者文件夹封装成对象 方便对文件与文件夹的属性信息进行操作 File对象可以作为参数传递给流的构造函数 一.构造函数和分隔符 public static void FileDemo() {//构造函数演示 //可以将一个已存在或不存在的文件或目录封装成File对象 File file = new File("d:\\a.txt"); File file2 = new File("d:","a.txt"); File file

Java性能优化指南系列(二):Java 性能分析工具

进行JAVA程序性能分析的时候,我们一般都会使用各种不同的工具.它们大部分都是可视化的,使得我们可以直观地看到应用程序的内部和运行环境到底执行了什么操作,所以性能分析(性能调优)是依赖于工具的.在第2章,我强调了基于数据驱动的性能测试是非常重要的,我们必须测试应用的性能并理解每个指标的含义.性能分析和数据驱动非常类似,为了提升应用程序的性能,我们必须获取应用运行的相关数据.如何获取这些数据并理解它们是本章的主题.[本章重点介绍JDK中提供的性能分析工具] 操作系统工具及其分析 程序分析的起点并不

Java学习笔记—第十二章 Java网络编程入门

第十二章  Java网络编程入门 Java提供的三大类网络功能: (1)URL和URLConnection:三大类中最高级的一种,通过URL网络资源表达方式,可以很容易确定网络上数据的位置.利用URL的表示和建立,Java程序可以直接读入网络上所放的数据,或把自己的数据传送到网络的另一端. (2)Socket:又称"套接字",用于描述IP地址和端口(在Internet中,网络中的每台主机都有一个唯一的IP地址,而每台主机又通过提供多个不同端口来提供多种服务).在客户/服务器网络中,当客

JAVA学习--面向对象的特征二:继承性

* 一.面向对象的特征二:继承性 * 1.为什么要设计继承性?  *  * 2.通过"class A extends B"类实现类的继承.  *   子类:A  父类(或基类 SuperClass):B  *     * 3.子类继承父类以后,父类中声明的属性.方法,子类就可以获取到.  *    明确:当父类中有私有的属性或方法时,子类同样可以获取得到,只是由于封装性的设计,使得子类不可以直接  *        调用罢了.  *   子类除了通过继承,获取父类的结构之外,还可以定义

JAVA学习第四十二课 — 泛型(二)—泛型接口&amp;&amp;通配符应用

一.泛型接口 interface Inter<T>{ public void show(T t); } class InterImple implements Inter<String>{//知道是字符串类型 public void show(String str){ System.out.println("show "+str); } } class InterImple_2<Q> implements Inter<Q>{//不知道是什