首页 > 学院 > 开发设计 > 正文

xml中的dtd约束的加深了解以及dom的解析方式和jaxp解析xml文档 ——Web部分第七天

2019-11-14 12:30:04
字体:
来源:转载
供稿:网友

xml中的dtd约束的加深了解以及dom的解析方式和jaxp解析xml文档 ——Web部分第七天

dtd约束的加深

* 语法<!ATTLIST 元素名称 属性名称 属性类型 属性的约束>* 属性类型包括: - CDATA : 字符串 - 枚举 : 如(aa|bb|cc)只能出现其中一个 - ID : 值只能是字母或者下划线开头<!ATTLIST name ID3 CDATA #REQUIRED><!ATTLIST name ID3 (aa|bb|cc) #REQUIRED><!ATTLIST name ID3 ID #REQUIRED>* 属性的约束 - #REQUIRED : 属性必须存在 - #IMPLIED : 属性可有可无 - FIXED : 表示一个固定值如#FIXED "aaa" , 属性必须设置这个固定值 ; - 直接值 : 不写属性,使用直接值, 写了属性,就用那个值。(相当于默认值)* 定义实体 - 语法<!ENTITY 实体名称 "实体内容"> - 引用时 &实体名称;(注:包括分号)。

- 定义实体要写在内部dtd里面,否则某些浏览器解析不到。

xml的解析方式

* xml的解析方式dom和sax(同html相同),三家公司提供了dom解析器 - jaxp(java相关) , dom4j(实际开发) , jdom 。

jaxp解析xml文档

* 包 javax.xml.perser , javax.xml.transform , org.w3c.dom ;* 下为dom的解析方式,添加删除的原理和js相同,个别方法名不同。package com.xml.test;import java.io.IOException;import java.security.acl.Permission;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.w3c.dom.Text;import org.xml.sax.SAXException;public class xmlTest { public static void main(String [] args) throws Exception{ //test01(); //test02(); //test03() ; //test04() ; //test05() ; test06() ; } /* * 递归遍历所有节点 */ PRivate static void test06() throws Exception { Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder() .parse("src/person.xml") ; Node node = document.getElementsByTagName("person").item(0) ; listAll(node) ; } private static void listAll(Node node) { if (node.getNodeType() == Node.ELEMENT_NODE ) { System.out.println(node.getNodeName()) ; } NodeList nodeList = node.getChildNodes() ; for(int i = 0 ; i < nodeList.getLength() ; i++ ){ Node nodeText = nodeList.item(i) ; if (nodeText.getNodeType() == Node.TEXT_NODE) { System.out.println(nodeText.getTextContent()); } listAll(nodeText) ; } } /* * 删除节点sex */ private static void test05() throws Exception { Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder() .parse("src/person.xml") ; Node node = document.getElementsByTagName("p1").item(0) ; Node node2 = document.getElementsByTagName("sex").item(0) ; node.removeChild(node2) ; Transformer transformer = TransformerFactory.newInstance().newTransformer() ; transformer.transform(new DOMSource(document) , new StreamResult("src/person.xml")) ; } /* * 修改xml标签下的内容 * 在p1的标签下修改<sex>nv</sex> nv为nan */ private static void test04() throws Exception { Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder() .parse("src/person.xml") ; Node node = document.getElementsByTagName("sex").item(0) ; node.setTextContent("nan") ; Transformer transformer = TransformerFactory.newInstance().newTransformer() ; transformer.transform(new DOMSource(document) , new StreamResult("src/person.xml")); } /* * 在p1的标签下添加<sex>nv</sex> * * 重点: 添加完成后的回写动作。 * * java的操作是在内存中完成的,并没有回写到文件。 */ private static void test03() throws Exception { Document document = DocumentBuilderFactory.newInstance() .newDocumentBuilder().parse("src/person.xml") ; Element sex = document.createElement("sex") ; Text sexText = document.createTextNode("nv") ; sex.appendChild(sexText) ; NodeList nodeList = document.getElementsByTagName("p1") ; nodeList.item(0).appendChild(sex) ; //回写操作 Transformer transform = TransformerFactory.newInstance().newTransformer() ; transform.transform(new DOMSource(document) , new StreamResult("src/person.xml")) ; } /* * 查询某一个节点。 */ private static void test02() throws Exception { DocumentBuilder documentBuilder = DocumentBuilderFactory .newInstance().newDocumentBuilder() ; Document document = documentBuilder.parse("src/Person.xml") ; NodeList nodeList = document.getElementsByTagName("name") ; Node node = nodeList.item(0) ; System.out.println(node.getTextContent()) ; } /* * 遍历xml */ private static void test01() throws Exception { //创建解析器工厂实例 DocumentBuilderFactory dbd = DocumentBuilderFactory.newInstance() ; //通过解析器工厂实例得到解析器 DocumentBuilder db = dbd.newDocumentBuilder() ; //通过解析器解析文档,得到Document对象 Document document = db.parse("src/person.xml") ; //得到标签节点 NodeList nodeList = document.getElementsByTagName("name") ; for(int i = 0 ; i < nodeList.getLength() ; i++ ){ //得到Node里面的值 Node node = nodeList.item(i) ; String str = node.getTextContent() ; System.out.println(str); } }}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表