XML文件
<?xml version="1.0" encoding="utf-8"?>
<!--使用内部DTD文件-->
<!DOCTYPE pets [
<!ELEMENT pets (dogs,penguins)>
<!ELEMENT dogs (dog*)>
<!ELEMENT penguins (penguin+)>
<!ELEMENT dog (name,health,love,strain?)>
<!ATTLIST dog id CDATA #REQUIRED>
<!ELEMENT penguin (name,health,love,sex)>
<!ATTLIST penguin id CDATA #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT health (#PCDATA)>
<!ELEMENT love (#PCDATA)>
<!ELEMENT starain (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
]>
<pets>
<dogs>
<dog id = "1">
<name>YAYA</name>
<health>100</health>
<love>99</love>
<strain>雪瑞</strain>
</dog>
<dog id = "2">
<name>OUOU</name>
<health>100</health>
<love>80</love>
<strain>拉布拉多</strain>
</dog>
</dogs>
<penguins>
<penguin id = "3">
<name>QQ</name>
<health>90</health>
<love>80</love>
<strain>Q仔</strain>
</penguin>
</penguins>
</pets>
DTD学习笔记
一个XML文档均以一下简单模块构成:元素、属性、实体、PCDATA(被解析的字符数据)、CDATA(字符数据)
<!DOCTYPE 文本根节点名称 [包含类别]>
声明一个元素:<!ELEMENT 元素名称 类别>或<!ELEMENT 元素名称 (元素内容)>
申明一个空元素:<!ELEMENT 元素名称 EMPTY> 如:<!ELEMENT br EMPTY>
带有子元素(序列)的元素:<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>
声明只出现一次的元素:<!ELEMENT 元素名称 (子元素名称)>
声明最少出现一次的元素:<!ELEMENT 元素名称 (子元素名称+)>
声明出现零次或多次的元素:<!ELEMENT 元素名称 (子元素名称*)>
声明出现零次或一次的元素:<!ELEMENT 元素名称 (子元素名称?)>
声明“非.../即...”类型的内容:<!ELEMENT note (to,from,header,(message|body))>
声明属性:
<!ATTLIST 元素名称 属性名称 属性类型 默认值> 如:<!ATTLIST payment type CDATA "check">
属性类型:CDAT(值为字符数据),(e1|e2|...)(此值是枚举列表),ID(值为唯一的id),IDREF(值为另一个元素的id),IDREFS(值为其他id列表)
NMTOKEN(值为合法XML名称),NMTOKENS(值为合法XML名称列表),ENTITY(为实体),ENTITIES(实体列表)NOATIOM(此值是符号的名称),
xml:(值是一个预定义的xml值)
默认值:值(默认值),#REQUIRED(值时必须的), #IMPLIED(值不是必须的), #FIXED value(值是固定的)
实体声明:<!ENTITY 实体名称 "实体的值"> 如:<!ENTITY writer "Bill Gates">
//得到Dom解析器的工厂实例
DocumentBuliderFactory dbf = FocumentBuliderFactory.newInstance();
try{
//从XML工厂获得DOM解析器
DocumentBulider db = dbf.newDocumentBulider();
//解析XML文档,得到一个Docment,即Dom树
Document doc = db.parse("pet.xml");
//得到所有dog节点列表信息
NodeList dogList = doc.getElementsByTagName("dog");
//循环dog信息
for(int i = 0; i < dogList.getLength(); i++){
//取得第i条dog的元素信息
Node dog = dogLisnt.item(i);
Element elementd = (Element)dog;
//取出第i dog的属性id值
String attrValue = element.getAttribute("id");
//取得dog标签下的所有标签
for(Node node = dog.getFirstChild(); node != null; node = node.getNextSibling()){
//判断该节点是否为 Element节点
if(node.getNodeType() == Node.ELMENT_NODE){
//取得第i个节点的节点名称
String name = node.getNodeName();
//取得第i个节点的节点下的第一个子节点的值
String value = node.getFirstChild().getNodeValue();
System.out.print(name+":"+value+"\t");
}
}
}
}catch(ParserConfigurationException e){
e.printStackTrace();
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(SAXException e){
e.printStackTrace();
}catch(IoException e){
e.printStackTrace();
}