第一天学习xml,知识点如下:
一、xml 中 a<b 不能正常显示,要用转义字符,但如果表达式过于长,可用CDATA区表示:
CDATA区:
可以解决多个字符都需要转义的操作 if(a<b && b<c && d<f) { }
把这些内容放在CDATA区,不需要转义了
写法:
<![CDATA[
if(a<b && b<c && d<f)
]]>
二、xml的约束:
dtd约束和Scheam约束
dtd约束:
创建一个文件 后缀名.dtd
步骤
(1)看xml中有多少个元素,有多少个元素,就写多少个<!ELEMENT>
(2)判断元素是简单元素还是复杂元素
复杂元素:有子元素的元素
<!ELEMENT 元素名称 (子元素)>
简单元素:
<!ELEMENT 元素名称 (#PCDATA)>
注意:元素名称左右有空格
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
(3)引入dtd文件的方式
1.在xml文件中引入dtd文件
<!DOCTYPE 根元素名称 SYSTEM "***.dtd">
<!DOCTYPE person SYSTEM "1.dtd">
2.使用内部的dtd文件
<!DOCTYPE 根元素名称[
<!ELEMENT ***********>
]>
3.使用外部的dtd文件(网络上的dtd文件)
(4)格式
复杂元素:
<!ELEMENT person(name,age)>
-子元素都只能出现一次,但也可利用以下符号
+:1/+ *:0/+ ?:0/1
如<!ELEMENT person(name+,age)>,即name可以出现多次
而对于分隔符: , 元素先后顺序 | 出现任意一个
(5)使用dtd定义属性
语法:
<!ATTLIST 元素名称
属性名称 属性类型 属性约束
>
属性类型:
-CDATA:字符串,如
<!ATTLIST birthday ID1 CDATA #REQUIRED>
-枚举:表示在一定范围内出现值,但是只能每次出现一个
(aa|bb|cc)
<!ATTLIST age ID2(aa|bb|cc) #REQUIRED>
属性的约束:
#REQUIRED:属性必须有
#IMPLIED :可有可无
#FIXED:固定值 #FIXED "aaa"
(6)实体的定义:
<!ENTITY 实体名称 实体的值>
<!ENTITY Test "haha">
使用实体: &实体名; &Test;(即可以用 &Test;来代替文本“haha”)
三、xml的解析
xml的解析技术:dom和sax
dom方式:如果文件过大,会造成内存溢出;增删查改容易
sax方式:(边读边解析,从上往下)不能增删查改;不会内存溢出
解析xml,首先需要解析器
sun公司提供了针对dom和sax的解析器 jaxp
dom4j组织针对dom和sax的解析器 dom4j(实际开发中最多)
jdom组织针对dom和sax的解析器 jdom
jaxp解析器!!!
jaxp解析器在jdk的javax.xml.parsers 包里:主要是 四个大类
dom:DocumentBuilder:解析器类、DocumentBuilderFactory:解析器工厂
sax:SAXParser:解析器类、SAXParserFactory:解析器工厂
DocumentBuilder类中主要方法有:
getElementsByTagName、createElement、createTextNode、appendChild、removeChild、getParentNode、getTextContent
等
最后实践了下,利用jaxp增删查改了xml文件中的节点。
四、问题
1.javascript中 直接document.getElementsByName("delrow")[0],取到 第一个delrow节点,一开始认为在java中也是一样,不过后来发现java中getElementsByName返回的是 NodeList,需要.item(index),发现与js的小小区别,js返回带有指定标签名的对象的集合,可直接通过数组的方法获取;
2.在利用jaxp 遍历xml所有节点时,可以用到递归的方法;
private static void getList(Node document) {
// if(document.getNodeName()!="#text") {
if(document.getNodeType()==Node.ELEMENT_NODE) {
System.out.println(document.getNodeName());
}
NodeList nodeList=document.getChildNodes();
for(int i=0;i<nodeList.getLength();i++){
Node node=nodeList.item(i);
getList(node);
}