<!doctype html>
<html lang="en">
<head>
<title>day</title>
<meta name ="day" charset="UTF-8">
</head>
<body>
<pre>
1、XML 简介
*extensible Markup Language :可扩展标记型语言
-标记型语言:html是标记型语言
-也是使用标签来操作
-可扩展
--html里面的标签是固定,每个标签都有特定的含义
--标签可以自己定义,可以写中文的标签
*xml用途
-html是用于显示数据,xml也可以显示数据(不是主要功能)
-xml主要功能,为了存储数据
-xml是w3c组织发布的技术
-xml有两个版本 1.0 1.1 ,目前都是1.0,因为1.1不能向下兼容
2、xml应用
*不同的系统之间传输数据
-qq之间数据的传输
-画图分析过程
*用来表示生活中有关系的数据
*经常用在配置文件
-比如现在连接数据库,肯定知道数据库的用户名和密码,数据名称
-如果修改数据库的信息,不需要修改源代码,只需要修改配置文件就可以了
3、xml的声明
-xml的文档声明
--创建一个文件,后缀是 .xml
--如果写xml,第一步,必须要有个文档声明,且必须放在第一行
<?xml version="1.0" encoding="utf-8" standalone="no"?>
--属性
*version : 1.0
*encoding: gbk utf-8 iso8859-1(不包含中文)
*standalone:表示xml是否独立,是否依赖其他文件
-定义元素(标签)
-定义属性
-注释
<!-- 注释内容 --> 不能嵌套,不能放第一行
-特殊字符
-CDATA
-PI指令:css xml相关联
<?xml-stylesheet type="text/css" href="showXML.css"?>
--设置样式:只能对英文标签名称起作用,对于中文的标签名称不起作用
4、xml的元素(标签)定义
*标记
-空标记
--<空标记的名称 属性列表/>
--<xia age="28" sex="nan"/>
--不允许<和xia之间有空格
-非空标记
--<标记名称 属性列表></标记名称>
--<name>xia<name>
--不允许<和name之间有空格
-一个xml中,只能有一个根标签
-树形结构
-在xml中,标签之间的空格换行都会被当做内容,文本数据和标记,其中的标记被称作标记的子标记。
-标记的名称:由字母,数字,下划线(_),点(.),连字符(-)组成,但是必须以字母或者下划线开头。 区分大小写
-名称中间不能包含 冒号(:)和 空格(' ')
*特殊字符
< : <
> : >
' : '
" : "
& : &
*CDATA段
-解决实体引用和字符引用阅读困难
<![CDATA[
原样输出
]]>
5、xml中属性的定义
*属性规则:
-一个标签上可以有多个属性
-属性名称不能相同
-属性不体现数据的结构,只是数据的附加信息
-属性名称和属性值之间使用 = ,属性值使用引号包起来(可以使单引号也可以是双引号)
-xml属性命名规范和元素命名规范一致
6、xml的元素约束
*有效的xml文件
-对xml的数据结构进行限制有两种方式:使用DTD(document type definition)和XMLschema,两者区别在,xmlschema是一个特殊得xml文件,而dta语法和xml不同
*元素约束
-格式:<!ELEMENT 标签名称 标记的约束条件>
--<!ELEMENT userName(user*)>
--<!ELEMENT 商店 (商店名称,开门时间,关门时间)>
--<!ELEMENT 商店名称 (#PCDATA)>
--<!ELEMENT 开门时间 (#PCDATA)>
--<!ELEMENT 关门时间 (#PCDATA)>
*XML和DTA关联
-<!DOCTYPE 根标记名称 SYSTEM "DTD文件URL">
-<!DOCTYPE 根标记名称 PUBLIC "正式公用标识符" "dtd文件url">
*DTD三种引入方式
-引入外部的文件
<!DOCTYPE 根标记名称 SYSTEM "url">
-网络dtd:<!DOCTYPE 根标记名称 PUBLIC "正式公用标识符" "url">
-内部实体
<!DOCTYPE 根标记名称[ dtd代码 ]>
-XML和DTD相关联必须写在XML声明之后
*DTD中的元素
-约束标记只包含文本数据(简单元素)
<!ELEMENT 标记名称 (#PCDATA)>
-约束子标记(复杂元素)
<!ELEMENT 标记名称 (子标记列表,逗号隔开)>
--注意这样的元素将元素约束xml文件中相应的标记只可以有子标记,不可以有显示文本数据,(\t\n\x0B\f\r)等
--子标记顺序不可以颠倒
-模拟限定符的使用
+:尾部加该限定符子标记必出现一次或多次
*:尾部加该限定符子标记可出现零次或多次
?:尾部加该限定符子标记可出现零次或一次
--<!ELEMENT 库存 (商品+,管理员?)>
|:两者存在一个标记即可
--<!ELEMENT 学历 (本科|硕士|博士)>
-EMPTY和ANY(简单元素)
-EMPTY:约束标记是空标记
-ANY:没有任何约束
*DTD完整性
-不允许无穷嵌套
-标记必须有元素对其进行约束
*IGNORE:忽略DTD中约束条件 和 INCLUDE:包含约束条件
-<![IGNORE[ 忽略的条件 ]]>
-<![INCLUDE[ 包含的条件 ]]>
*自定义实体引用
-定义的实体需要写在内部DTD里面
<!ENTITY 实体名称 "代表的值">
-在xml中引用
--&实体名称;
7、DTD中的属性约束列表
*<!ATTLIST 标记名称 属性名称 属性类型 默认值>
-<!ATTLIST room width CDATA "0" length CDATA "0">
-属性的默认值都是字符串"0"
-属性值中都不能含有实体引用和字符引用
*属性类型
-CDATA:字符串,不能含有实体引用和在字符引用
-Enumerated:属性值是枚举的 1|2
-NMTOKEN:属性值不能含有空格
-ID:ID类型的属性值必须互不相同,属性值以字母或者下划线开头,且属性值只能是#IMPLIED或#REQUIRED
-IDREF:通过标记属性值来判断标记之间的联系,属性值只能取ID类型的属性值
*属性的默认值
-默认值是字符串:标记该属性默认值是red,标签如果在重新设置color 也没错,且以新值为算
--<!ATTLIST desktop color CDATA "red">
-#IMPLIED:标记可以没有该属性,没有默认值 或 #REQUIRED:标记必须有该属性,没有默认值
--<!ATTLIST desktop color CDATA #IMPLIED>
--<!ATTLIST desktop color CDATA #REQUIRED>
-FIXED:标记可以没有该属性,如果有,属性值固定不变
--<!ATTLIST desktop color CDATA #FIXED "字符串">
8、xml的解析的简介
*xml是标记型文档
*js使用dom解析标记型文档?
-根据html的层级结构,在内存中分配一个树形结构,把html的标签属性和文本都封装成对象
-document,element,属性对象,文本对象,node节点
*xml的解析方式(技术):DOM 和 SAX
*画图分析使用dom和sax解析xml过程
*dom解析方式
-根据xml的层级结构在内存中分配一个树形结构,把xml的标签属性和文本都封装成对象
-缺点:如果文件过大,造成内存溢出
-优点:很方便实现增删改
*sax解析方式
-采用事件驱动,边读边解析。从上到下一行一行解析,解析到某个对象,返回对象名称
-缺点:不能实现增删改操作
-优点:如果文件过大,不会造成内存溢出,方便实现查询操作
*想要解析xml,首先需要解析器
-不同的公司和组织提供了针对dom和sax方式的解析器,通过api方式提供
--sun公司提供了针对dom和sax解析器 : jaxp
--dom4j组织提供了针对dom和sax解析器 : dom4j(实际开发中***)
--jdom组织提供了针对dom和sax解析器 :jdom
9、jaxp的API查看
*JAXP:(Java API for XML Processing)开发包是se的一部分,有以下几个包及其子包组成:
-org.w3c.dom:提供DOM方式解析XML的标准接口
-org.xml.sax:提供SAX方式解析XML的标准接口
-javax.xml:提供了解析XML文档的类
*java.xml.parsers包中,定义了几个工厂类,通过这些类,得DOM和SAX解析对象:
-DocumentBuilder:解析器类 DocumentBuilderFactory:解析器工厂
-SAXParser:解析器类 ,SAXParserFactory:解析器工厂
******JAXP*******主*******要******步*****骤****
(1)使用javax.xml.parsers包中的DocumentBuilderFactory对象调用newInstance()实例化DocumentBuilderFactory对象
-DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
(2)使用DocumentBuilderFactory对象调用newDocumentBuilder()方法返回一个DocumentBuilder对象,该对象被称为DOM解析器
-DocumentBuilder domParser = fatory.newDocumentBuilder();
(3)DOM解析器对象调用public Document parser(File f)方法解析参数f指定XML文件,该方法返回对象就是实现了Document接口一个实例
-Document document = donParser.parser(new File("student.xml"));
(4)通过上面三步,DOM解析器domParser调用parser方法返回对象document是一些Node对象所构成,Node对象被习惯称为节点,这些节点组成树形结构,Document的结构和XML标记组成的结构是相同的,即document就是DOM解析器在内存中建立和XML文件相应的树形结构
*接口Document对象:
-Element getElementById(String elementId)
返回具有带给定值的 ID 属性的 Element。
-NodeList getElementsByTagName(String tagname)
按文档顺序返回包含在文档中且具有给定标记名称的所有 Element 的 NodeList。
-Element createElement(String tagName)
创建指定类型的元素。
-Text createTextNode(String data)
创建给定指定字符串的 Text 节点。
- String getXmlEncoding()
作为 XML 声明的一部分,指定此文档编码的属性。
-boolean getXmlStandalone()
作为 XML 声明的一部分,指定此文档是否为独立文档的属性。
-String getXmlVersion()
作为 XML 声明 的一部分指定此文档版本号的属性。
-Element getDocumentElement()
这是一种便捷属性,该属性允许直接访问文档的文档元素的子节点。
- DocumentType getDoctype()
与此文档相关的文档类型声明
*接口Node对象
-Node appendChild(Node newChild)
将节点 newChild 添加到此节点的子节点列表的末尾。
-Node removeChild(Node oldChild)
从子节点列表中移除 oldChild 所指示的子节点,并将其返回。
-Node replaceChild(Node newChild, Node oldChild)
将子节点列表中的子节点 oldChild 替换为 newChild,并返回 oldChild 节点。
-Node getParentNode()
此节点的父节点。
-Node getFirstChild()
此节点的第一个子节点。
-Node getLastChild()
此节点的最后一个节点。
-Node cloneNode(boolean deep)
返回此节点的副本,即允当节点的一般复制构造方法。
- String getTextContent()
此属性返回此节点及其后代的文本内容。
-NodeList getChildNodes()
包含此节点的所有子节点的 NodeList。
-void setTextContent(String textContent)
此属性返回此节点及其后代的文本内容。
*接口NodeList对象
-int getLength()
列表中的节点数。
-Node item(int index)
返回集合中的第 index 个项。
*接口Element对象
-String getTagName()
元素的名称。
-String getAttribute(String name)
通过名称获得属性值。
- void setAttribute(String name, String value)
添加一个新属性。
*回写xml(重点)
//*****回写xml Transform对象
-TransformerFactory factory1 = TransformerFactory.newInstance();
-Transformer transformer = factory1.newTransformer();
-transformer.transform(new DOMSource(document), new StreamResult("src/student.xml"));
*代码演示 student.java
public static void deleteSex()throws Exception
{
//工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//xml解析器
DocumentBuilder domParser = factory.newDocumentBuilder();
//document对象
Document document = domParser.parse("src/student.xml");
/*
* //NodeList对象
NodeList nodeList = document.getElementsByTagName("sex");
Node stu = nodeList.item(0);
//得到sex
Node sex =stu.getLastChild();
//删除sex
stu.removeChild(sex);
*/
//NodeList 对象
NodeList nodeList = document.getElementsByTagName("sex");
//父节点stu
Node sex = nodeList.item(0);
Node stu = sex.getParentNode();
//删除sex
stu.removeChild(sex);
//回写
TransformerFactory factory1 = TransformerFactory.newInstance();
Transformer transfomer = factory1.newTransformer();
transfomer.transform(new DOMSource(document), new StreamResult("src/student.xml"));
}
public static void modifySex() throws Exception
{
//创建解析器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//xml解析器
DocumentBuilder domParser = factory.newDocumentBuilder();
//document对象
Document document = domParser.parse("src/student.xml");
//获取sex节点
NodeList nodeList = document.getElementsByTagName("sex");
Node sex = nodeList.item(0);
//设置内容通过方法 setTextContent方法
sex.setTextContent("woman");
//回写xml
TransformerFactory factory1 = TransformerFactory.newInstance();
Transformer transformer = factory1.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/student.xml"));
}
public static void addSex() throws Exception
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//xml解析器
DocumentBuilder domParser = factory.newDocumentBuilder();
//document
Document document = domParser.parse(new File("src/student.xml"));
//stu节点
NodeList nodeList = document.getElementsByTagName("stu");
//创建sex
Element sex = document.createElement("sex");
//创建文本
Text text = document.createTextNode("man");
//sex添加text,stu添加sex
sex.appendChild(text);
nodeList.item(0).appendChild(sex);
//*****回写xml Transform对象
TransformerFactory factory1 = TransformerFactory.newInstance();
Transformer transformer = factory1.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/student.xml"));
}
private static void myMethod()throws Exception {
//创建解析工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//创建解析器
DocumentBuilder domParser = factory.newDocumentBuilder();
//解析xml返回Document对象
Document document = domParser.parse(new File("src/student.xml"));
//获取所有的节点并输出
NodeList childNodes = document.getChildNodes();
//得到name元素
NodeList list = document.getElementsByTagName("name");
//遍历集合
for(int i=0 ; i<list.getLength() ;i++)
{
//获得name节点
Node name1 = list.item(i);
//获取文本
String text1 = name1.getTextContent();
System.out.println(text1);
}
//xml声明相关信息
System.out.println("xml Version:"+document.getXmlVersion());
System.out.println("xml encoding:"+document.getXmlEncoding());
System.out.println("xml standalone:"+document.getXmlStandalone());
//XML文件根节点名称
Element root = document.getDocumentElement();
System.out.println("根节点名称:"+root.getNodeName());
//获取DocumentType对象:该对象就是文档的根标记或者与其关联的DTD文件
DocumentType root1 = document.getDoctype();
System.out.println(root.getNodeName());
System.out.println("------------------------------------------------------------");
listElement(list);//调用函数输出所有节点
}
public static void selectSingle() throws Exception
{
//DocumentBuilderFactory对象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//DocumenBuilder对象
DocumentBuilder domParser = factory.newDocumentBuilder();
//解析xml,Document对象
Document document = domParser.parse(new File("src/student.xml"));
//NodeList集合
NodeList nodeList = document.getElementsByTagName("name");
//获取第一个name节点
System.out.println(nodeList.item(0).getTextContent());
}
public static void listElement(NodeList nodeList) throws Exception
{
int size = nodeList.getLength();
for(int i=0 ; i<size ; i++)
{
Node node = nodeList.item(i);
if(node.getNodeType()==Node.TEXT_NODE)
{
System.out.println(node.getNodeType());
Text textNode = (Text)node;
String wholeText = textNode.getWholeText();
System.out.println(wholeText);
}
if(node.getNodeType()==Node.ELEMENT_NODE)
{
System.out.println(node.getNodeType());
Element elementNode = (Element)node;
String nodeName = elementNode.getNodeName();
System.out.print(nodeName+":");
NodeList nodes = elementNode.getChildNodes();
listElement(nodes);
}
}
}
</pre>
</body>
</html>
XML知识点
猜你喜欢
转载自blog.csdn.net/weixin_39531549/article/details/81354842
今日推荐
周排行