首页 > 代码库 > Java学习之Xml系列一:初始步骤、查询元素及属性、遍历元素

Java学习之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>
</SwordLibrary>

java代码:

package JavaLeaner.XmlTest;

import java.io.IOException;

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.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class XmlDemo1 {

    /*
     * xml的helloworld
     * 初始三大步骤:
     * 1.建文档构造工厂
     * 2.建文档构造器
     * 3.建文档对象
     */
    @Test
    public void Test1() throws ParserConfigurationException, SAXException, IOException
    {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docDuilder = factory.newDocumentBuilder();
        Document doc = docDuilder.parse("src/JavaLeaner/XmlTest/SwordLib.xml");
        //注意:在eclipse中写dtd和xml,如果dtd本身不正确会导致xml编辑器无法提示出所引用dtd的元素和属性。
        //注意:只要xml和dtd文件格式正确,以上建立Document的操作无编译错误,并且运行也正常。
        //这说明建立Docment的操作与否仅仅与xml和dtd文件格式是否正确有关,而与xml是否符合dtd无关。(实验了子元素顺序跌倒,确实requried属性等接等够正常运行)
        //但是,xml不符合dtd,eclipse IDE会进行提示。
    }
    
    /*
     * xml查询特定元素
     * 
     */
    @Test
    public void Test2() 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");
        Node node = list.item(0);
        Element swordTag=(Element)node;
        String snoText=swordTag.getAttribute("sno");
        String tagText=swordTag.getTextContent();

        System.out.println("sno:"+snoText);
        System.out.println("tagText:"+tagText);    
        //即使运行到这里,如果xml的sword元素没有sno属性,依然可以正常运行,只不过结果为空串
        //此时运行结果:
        //sno:
        //tagText:欢欣之刃100010
        //
        //xml正确时的结果:
        //sno:s1
        //tagText:欢欣之刃100010
        //注意:元素内有子元素,其getTextContent()得到的是取出xml格式后的纯内容
        
        
    }
    
    
    /*
     * xml遍历某一元素下的所有子元素和属性
     */
    @Test
    public void Test3() throws ParserConfigurationException, SAXException, IOException
    {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docDuilder = factory.newDocumentBuilder();
        Document doc = docDuilder.parse("src/JavaLeaner/XmlTest/SwordLib.xml");
        //注意:在eclipse中写dtd和xml,如果dtd本身不正确会导致xml编辑器无法提示出所引用dtd的元素和属性。
        //注意:只要xml和dtd文件格式正确,以上建立Document的操作无编译错误,并且运行也正常。
        //这说明建立Docment的操作与否仅仅与xml和dtd文件格式是否正确有关,而与xml是否符合dtd无关。(实验了子元素顺序跌倒,确实requried属性等接等够正常运行)
        //但是,xml不符合dtd,eclipse IDE会进行提示。
        
        NodeList list = doc.getElementsByTagName("Sword");
        //注意:NodeList是个接口,并且它没有实现Iterable接口,所以不能使用增强for循环来遍历
        //Can only iterate over an array or an instance of java.lang.Iterable
        //错误用法:for(Node node:list){}
        for(int i=0;i<list.getLength();i++)
        {
            Element swordTag=(Element)list.item(i);
            
            String snoText=swordTag.getAttribute("sno");
            System.out.println("sno:"+snoText);
            
            String SwordName = swordTag.getElementsByTagName("SwordName").item(0).getTextContent();
            String Price = swordTag.getElementsByTagName("Price").item(0).getTextContent();
            String Attack = swordTag.getElementsByTagName("Attack").item(0).getTextContent();
            System.out.println("SwordName:"+SwordName);
            System.out.println("Price:"+Price);
            System.out.println("Attack"+Attack);
            
/*            sno:s1
            SwordName:欢欣之刃
            Price:1000
            Attack10*/

            
        }
        
    }
    
    
}