Java XML 文件的 DTD 解析规则,DOM 方式解析 XML
HTML,Hyper Text Markup Language,超级文本标记(标签)语言
- 出现目的是服务器给浏览器发送响应信息,
- 浏览器按照规则解析语言并进行展示
XML,eXtensible Markup Language,可扩展标记(标签)语言
- 创建 XML 的宗旨不是为了扩展 HTML,
- 而是为了数据的存储和传输
(1)写法
创建 .xml 文件,建议在文件的第一行添加头信息
<?xml version="1.0" encoding="UTF-8" >
(2)规则
- 结构良好,标签
<xxx></xxx>
形式 结构有效,在结构良好的基础上遵循很多规则(所写标签、标签名、属性名、属性数量、标签顺序…)
- 一个遵循结构有效的 xml 文件,需要一个文件来解释 xml 文件(类似于元注解对注解的解释作用)
(3)四种文件类型
- .tld Tag Library Definition,标签描述
- .dtd Document Type Difinition,文档类型描述
- .xsd Xml Schema Definition,XML文档内容描述
- .xml eXtensible Markup Language,存储数据的文档
XML 的 DTD 规则
自定义 DTD 规则,可以写在两个地方:
- 写在当前的 xml 文件中
- 写在外部 dtd 文件中,然后引入 xml 文件
(1)描述根标记
DTD 规则写在当前的 xml 文件中
<!DOCTYPE 根标签 [规则]>
DTD 规则写在外部文件中
<!DOCTYPE 根标签 SYSTEM “文件名”>
<!DOCTYPE 根标签 PUBLIC “路径名”>
(2)描述根标记中的子标记
DTD 规则写在当前的 xml 文件中时,以下配置写在规则中
类别通常是
EMPTY
,意味着空<!ELEMENT 标签名 EMPTY >
类别可以是
ANY
,意味着可包含任何可解析数据的组合<!ELEMENT 标签名 ANY>
元素内容写法:
()
<!ELEMENT 标签名 (子标签, 其余子标签, …) >
正常情况下描述标签内部的子标签时,默认是一个;还需要在子标签后面增加对于个数的说明
符号 | 个数 |
---|---|
a* | 0 ~ n 个 a 标签 |
a? | 0 ~ 1 个 a 标签 |
a+ | 1 ~ n 个 a 标签 |
a | b | a 或者 b |
a,b | a b 都有,并且依照a标签、b标签的顺序出现 |
标签内部有可被解析的字符数据即 PCDATA,通常用来描述标签中间的文字
- PCDATA:Parsed Character DATA,通常用来描述标签中间的可以被解析的字符数据,其支持实体字符
<!ELEMENT 标签名 (#PCDATA) >
标签内部有不能被解析的字符数据即 CDATA
<!ELEMENT 标签名 (#CDATA) >
(3)描述标记中的属性
<!ATTLIST 标签名称 属性名称 属性类型 属性值>
属性类型 的常用描述
- CDATA(Character DATA)不能被解析的字符数据,通常用来描述属性名
- 还经常使用
(type1|type2|type3)
来描述
属性值 的描述
- 默认值,比如
"xxx"
#REQUIRED
属性值是必需的#IMPLIED
属性不是必需的#FIXED value
属性值是固定的
(4)描述标记中的实体字符
<!ENTITY 实体名称 "实体字符的值">
- 实体字符,比如
- 所以我们并描述的实体字符,可以这么使用
&实体名称;
解析 XML
解析 XML 文件内容,本质是文件内容的读取
解析XML文件主要有两种方式:DOM、SAX
DOM 解析(Document Object Model)又称为树结构处理方式;解析全部文档然后形成一个树结构 节点(标签)
- Java 底层提供支持
- 优点是编程容易并且安全
- 缺点是必须将整个文档全部处理完毕,即第一次加载速度较慢
SAX 解析(Simple Api for Xml)类似流媒体,是基于事件的模式,解析时候触发一系列事件,即当某一个标签被解析的时候激活后续的方法
- 优点是加载快,不需要将所有文档都一次性处理完
- 缺点是编程很麻烦并且复用性低
DOM 解析升级版
- JDOM(Java-based Document Object Model),需要外部 jar 包,基于 DOM 方式升底层提性能
- DOM4J(Document Object Model for Java),需要外部 jar 包,基于 JDOM 方式提升底层性能;最常用!
(1)DOM 方式解析 XML
与 JavaScript 的 dom 操作非常类似哦
得到 document 对象
//1.需要一个工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//2.利用工厂创建工人
DocumentBuilder builder = factory.newDocumentBuilder();//3.工人创建一个document对象(需要xml文件)
Document document = builder.parse(new File(“xml文件路径”));获取标签
//方式一
Element xxx = document.getDocumentElement(); //获取根标签//方式二
Element xxx = document.getElementById(“id属性值”); //需要有dtd规则//方式三
NodeList list = document.getElementsByTagName(“标签名”); //返回值是Node集合Element xxx = (Element) list.item(0); //get方法
int = list.getLength(); //集合长度
- document 也是元素,即 Element
- 上述方法每个 Element 都有
//获取xxx元素的所有子标签
NodeList = xxx.getChildNodes(); //需要有dtd规则//获取xxx元素的第一个子标签
Element = (Element) xxx.getFirstChild();//获取xxx元素的最后一个子标签
Element = (Element) xxx.getLastChild();获取标签中的属性
String = xxx.getAttribute(“属性名”);
获取标签中的文本内容
String = xxx.getTextContent();
补充:通过操作 document 还可以写入标签,
Element newElement = document.createElement(“标签名”);
newElement.setAttribute(“属性名”,”属性值”);
newElement.appendChild(Element);
但开发中 XML 与注解互用用来读取配置,而传输信息更多的使用 JSON(所以基本没有需求在开发中向 xml 文件写入)
(2)JDOM 方式解析 XML
- jdom-2.0.6.jar
得到 document 对象
SAXBuilder builder = new SAXBuilder();
Document document = builder.build(new File(“xml文件路径”));
获取标签
//方式一
Element xxx = document.getRootElement(); //获取根标签//方式二
Element = xxx.getChild(“yyy”); //获取xxx标签下第一个yyy子标签//方式三
List= xxx.getChildren(“yyy”); //获取xxx标签下所有yyy子标签 //方式四
List= xxx.getChildren(); //获取xxx标签下所有子标签 获取标签中的属性
String = xxx.getAttributeValue(“属性名”);
获取标签中的文本内容
String = xxx.getText();
String = xxx.getChildText(“yyy”); //获取xxx标签的yyy子标签的文本内容
(3)DOM4J 方式解析 XML
- dom4j-2.1.1.jar
得到 document 对象
SAXReader reader = new SAXReader();
Document document = reader.read(new File(“xml文件路径”));
获取标签
//方式一
Element xxx = document.getRootElement(); //获取根标签//方式二
Element = xxx.element(“yyy”); //获取xxx标签下第一个yyy子标签//方式三
List= xxx.elements(“yyy”); //获取xxx标签下所有yyy子标签 //方式四
List= xxx.elements(); //获取xxx标签下所有子标签 获取标签中的属性
String = xxx.attributeValue(“属性名”);
获取标签中的文本内容
String = xxx.getText();
String = xxx.elementText(“yyy”); //获取xxx标签的yyy子标签的文本内容
还没有评论,来说两句吧...