话不多说,全在代码和注释说明里了。
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*/
}
}
}