一、什么是XML
1、XML指可扩展标记语言(Extensible Markup Language)
2、XML是一种标记语言,很类似HTML
3、XML的设计宗旨是传输数据而非显示数据
4、XML标签没有被预定义,你需要自己定义
5、XML被设计为具有自我描述性
6、XML是W3C推荐标准
二、HTML和XML区别
1、HTML语法比较松散,XML语言严格
2、HTML所有标签都是预先定义号的,使用固定标签展示不同内容
3、XML标签都是自定义
4、XML用处:数据存储、配置文件、数据传输
三、XML基本语法
1、文档声明:
<?xml version="1.0" encoding="UTF-8"?>//必须放在第一行
属性:version版本号 固定为"1.0"
encoding文档码表 默认iso-8859-1
standalone指定文档是否独立yes或no,是否可以引用其它文件
2、规则:
所有XML元素都得有关闭标签
XML标签对大小写敏感
XML必须正确的嵌套
XML文档必须有根元素
XML属性值需要加引号
实体引用:
再XML中一些z字符拥有特殊意义
如果把字符"<"放在XML元素中,会放生错误,这是因为解析器会把它当作新元素开始。这样会产生XML错去
5个预定义实体引用:
<<
>>
&&
''
""
3、元素:
名称可以包含z字母、数字j及其它字符
名称不能以数字或者标点符号开头
名称不能以xml(XML\Xml)开始
名称不能包含空格
4、文本:
<![CDATA[数据内容]]>里面的内容会原样显示
四、XML约束
1、DTD约束
内部dtd:再xml当中定义dtd
外部dtd:再外部文件当中单独定义dtd
本地:<!DOCTYPE 名称 SYSTEM "student.dtd">
网络:<!DOCTYPE students PUBLIC "命名空间" "student.dtd">
学习要求:不用自己写dtd,只需要看懂别人的dtd约束
存在问题:再标签中存放的内容bbu不知道是什么类型,写的都是汉字这种约束不严谨
2、schema约束
1)编写根标签
2)引用约束地址:xsi:schemaLocation="默认空间 约束地址.xsd"
3)引用实例名称空间:xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4)默认名称空间:xmlns="http://www.it666.cn/xml"
<students xsi:schemaLocation="http://www.it666.cn/xml student.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.it666.cn/xml"
>
</students>
五、DOM解析
结点:
文档结点:syudent.xml Document:文档结点 xml文件
元素结点:Element 元素结点 使用<>标签
属性结点:Attr 属性结点 元素上属性名="属性值"
文本结点:Text 元素之间的内容
DOM:Document Object Model文档对象模型 把文档成员描述称一个个对象
使用java代码操作xml
DOM解析特点:
1)再加载时一次性把整个XML文档加载进n内存,再内存中形成一棵树
2)以后使用代码操作Document,其实操作的是内存中 的DOM树,和本地磁盘中的xml文件没有直接关系。
3)由于操作的是内存中的dom树,磁盘中xml文件没有改变,要进行同步让两边保持一致(查询不需要同步 z只有数据变化时需要同步)
4)缺点:xml文件过大可能造成内存溢出
DOM解析步骤:
1)创造解析器工厂
2)通过解析器工厂得到解析器
3)通过解析器得到document对象
4)获取具体结点内容
获取具体结点内容:
//1.创建解析器工厂
DocumentBuilderFactory bdf=DocumentBuilderFactory.newInstance();
//2.通过解析器工厂获得解析器
DocumentBuilder db=bdf.newDocumentBuilder();
//3.通过解析器得到document对象
Document doc=db.parse("src/com/xml/parse/student.xml")
//4.根据节点获取具体节点内容
NodeList allStu=doc.getElementsByTagName("student");
//5.获取第一学生
Node stu=allStu.item(0);
//6.把学生当中所有文本打印粗来
System.out.println(stu.getTextContent());
修改元素内容:
//1.创建解析器工厂
DocumentBuilderFactory bdf=DocumentBuilderFactory.newInstance();
//2.通过解析器工厂获得解析器
DocumentBuilder db=bdf.newDocumentBuilder();
//3.通过解析器得到document对象
Document doc=db.parse("src/com/xml/parse/student.xml")
//4.获取素有指定结点
NodeList ageList =doc.getElementsByTagName("age");
//5.获取要修改的结点内容
Node ageNode=ageList.item(1);
//6.修改元素内容
ageNode.setTextContent("30");
//7.从内存写道文档做同步
Transformer tf=TransformerFactory.newInstance().newTransformer();
tf.transform(new DOMSource(doc),new StreamResult("src/com/xml/parse/student.xml"))
DOM添加元素:
//1.创建解析器工厂
DocumentBuilderFactory bdf=DocumentBuilderFactory.newInstance();
//2.通过解析器工厂获得解析器
DocumentBuilder db=bdf.newDocumentBuilder();
//3.通过解析器得到document对象
Document doc=db.parse("src/com/xml/parse/student.xml")
//4.创建一个结点
Element addressEle =doc.createElement("address");
//5.设置元素内容
addressEle.setTextContent("地址1");
//6.获取要添加元素的父结点
Node stuNode=doc.getElementByTageName("student").item(0);
//7.添加结点
stuNode.appendChild(addressEle);
//8.同步
Transformer tf=TransformerFactory.newInstance().newTransformer();
tf.transform(new DOMSource(doc),new StreamResult("src/com/xml/parse/student.xml"))
DOM删除元素:
//1.创建解析器工厂
DocumentBuilderFactory bdf=DocumentBuilderFactory.newInstance();
//2.通过解析器工厂获得解析器
DocumentBuilder db=bdf.newDocumentBuilder();
//3.通过解析器得到document对象
Document doc=db.parse("src/com/xml/parse/student.xml")
//4.获取一个结点
Node addressNode=doc.getElementsByTagName("address").item(0);
//5.获取该结点的父节点并从父节点中删除
addressNode.getParentNode().removeChild(addressNode);
//6.同步
Transformer tf=TransformerFactory.newInstance().newTransformer();
tf.transform(new DOMSource(doc),new StreamResult("src/com/xml/parse/student.xml"))
DOM添加元素属性:
//1.创建解析器工厂
DocumentBuilderFactory bdf=DocumentBuilderFactory.newInstance();
//2.通过解析器工厂获得解析器
DocumentBuilder db=bdf.newDocumentBuilder();
//3.通过解析器得到document对象
Document doc=db.parse("src/com/xml/parse/student.xml")
//4.获取要添加属性的结点
Node stu=doc.getElementsByTagName("student").item(0);
//5.把获取的结点强制转换成Element
Element ele=(Element)stu;
//6.设置属性
ele.setAttribute("ID","00001")
//7.同步
Transformer tf=TransformerFactory.newInstance().newTransformer();
tf.transform(new DOMSource(doc),new StreamResult("src/com/xml/parse/student.xml"))
六、Dom4j
1、DOM4j:
是dom4j.org出品的一个开源XML解析包
是一个十分优秀的javaXML API.具有性能优异、功能强大和极易使用d的特点,它性能超过sun公司官方d的dom技术,同时它也是一个开放源代码的软件
越来越多的java软件都再使用dom4j来读写xml
2、获取指定标签内容
//1.创建SAXReader
SAXReader reader=new SAXReader();
Document doc=reader.read("src\\com\\xml\\dom4j\\student.xml");
//2.获取根元素
Element rootElement=doc.getRootElement();
//3.根据名称获取根元素下所有元素
List<Element> stuList=rootElement.elements("student");
//4.遍历每一个元素
for(Element stuEle:stuList)
{
//Element nameEle=stuEle.element("name");
//System.out.println(nameEle.getText());
String name=stuEle.elementText("name");
String num=stuEle.attributeValue("number");
}
//5.获取指定名称元素
//6.获取标签当中的文本
3、添加元素
//1.创建SAXReader
SAXReader reader=new SAXReader();
Document doc=reader.read("src\\com\\xml\\dom4j\\student.xml");
//2.获取根元素
Element rootEle=doc.getRootElement();
//3.给根源素添加元素和属性
Element stuEle=rootEle.addElement("student").addAttribute("number","a0003");
stuEle.addElement("name").setText("王无");
Writer wr=new OutputStreamWriter(new FileOutputStream("src\\com\\xml\\dom4j\\student.xml","UTF-8");
doc.write(wr);
wr.close();