XML_dtd属性与 解析

属性:

<?xmlversion="1.0"encoding="GBK"?>

<!DOCTYPEstudents[

<!ELEMENTstudents(student)*>

<!ELEMENTstudent(#PCDATA)>

<!ATTLISTstudentidID#REQUIRED>

<!ATTLISTstudentnameCDATA#REQUIRED>

<!ATTLISTstudentgender(男|女)#IMPLIED>

<!ATTLISTstudentipNMTOKEN#IMPLIED>

<!ATTLISTstudentaddressCDATA#FIXED'传承路'>

<!ATTLISTstudentageCDATA'20'>

<!ENTITYhello"猫">

<!ENTITYhellSYSTEM"entity.txt">

]>

<!--

DTD中属性的定义:

格式:

<!ATTLIST属性所在的元素属性的名字属性的类型默认值类型>

属性的类型:

ID:表示该元素唯一类型为ID的属性在文档中是唯一的

如果属性类型是ID则不能以数字开头

CDATA:表示字符数据(最常用)

枚举类型:将所有可以出现的情况列举出来如:(男|女)

NMTOKEN:是CDATA一个子类表示该属性的值只能包括:字母数字句号_中间不能包括空格

默认值类型:

#REQUIRED表示该属性必须出现

#IMPLIED表示该属性可以出现

#FIXED表示该属性的值是固定的不能够改变

实体:

内部实体:

<!ENTITY实体的名字"实体中的内容">

引用实体方式:&实体名称

外部实体:

<!ENTITY实体名称SYSTEM"资源路径">

-->

<students>

<studentid='no1'name='asf'gender='男'ip='192.168.12.1'>

&hell;

&hello;

</student>

</students>


解析实例:

package XML.dom;


import java.io.File;
import java.io.IOException;


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 MyDomTest {


public static void main(String[] args) {
//解析文档需要一个解析器
//第一步:先拿到一个工厂对象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

try {
//第二步:获取解析器
DocumentBuilder builder =factory.newDocumentBuilder();
//第三步:进行解析,获得Document对象
Document doc = builder.parse(new File("src/Task2.xml"));
//
// NodeList nodeList = doc.getChildNodes().item(1).getChildNodes();
// System.out.println("当前根节点的节点数"+nodeList.getLength());
//随机访问已知元素名称的指定节点
NodeList nodeList = doc.getElementsByTagName("students");
Node node = nodeList.item(0);
listAllNodes(node);

} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

//对指定的节点进行遍历
public static void listAllNodes(Node node){
System.out.println("节点名 "+node.getNodeName()+
" 节点值 "+node.getNodeValue());

//判断节点的类型 遍历当前元素节点的属性
if(node.getNodeType()==Node.ELEMENT_NODE){
if(node.hasAttributes()){//判断是否有属性节点
NamedNodeMap attrs= node.getAttributes();//获取属性集合
for(int i=0;i<attrs.getLength();i++){
Node attrNode = attrs.item(i);//获取当前节点
System.out.println(attrNode.getNodeName()+
"---"+attrNode.getNodeValue());
}

/*Element e = (Element) node;//造型 还原
e.getAttribute("name");*/
}

//遍历当前元素节点的子节点,利用递归实现
if(node.hasChildNodes()){//如果有子节点
NodeList nodeList = node.getChildNodes();
for(int i=0;i<nodeList.getLength();i++){
Node childNode = nodeList.item(i);
listAllNodes(childNode);//递归
}
}
}
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值