Day 11
Jaxp解析器在jdk的javax.xml.parsers包裏面
使用Jaxp實現查詢操作:
Person.xml
<?xml version="1.0"encoding="UTF-8"?>
<person>
<p1>
<name>zhangsan</name>
<age>20</age>
</p1>
<p1>
<name>zhangsan</name>
<age>20</age>
</p1>
</person>
TestJxap.java
//目的查詢所有name元素的值
//1創建解析器工廠
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();
//根據解析器工廠創建解析器
DocumentBuilder builer= builderFactory.newDocumentBuilder();
//根據xml返回document
Document document=builer.parse("src/person.xml");
//得到name元素
NodeList list=document.getElementsByTagName("name");
//遍歷
for(inti = 0;i<list.getLength();i++) {
Node name1= list.item(i);//得到每一個元素
//得到每一個元素的值
Strings= name1.getTextContent();
System.out.println(s);
}
使用jaxp添加節點
目標題目:在第一個P1下面添加一個性別女
publicstaticvoid AddSex() throws ParserConfigurationException,SAXException, IOException, TransformerException {
//創建解析器工廠
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
//創建解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
//得到document
Document document = builder.parse("src/person.xml");
//得到p1
NodeList list = document.getElementsByTagName("p1");
//得到第一個p1
Node list1 = list.item(0);
//創建標籤
Element sex1 = document.createElement("sex");
//創建文本
Text text1 = document.createTextNode("nv");
//添加文本到標籤下
sex1.appendChild(text1);
//把sex1添加到p1
list1.appendChild(sex1);
//會寫xml
TransformerFactory transformerfactory= TransformerFactory.newInstance();
Transformer trand = transformerfactory.newTransformer();
trand.transform(new DOMSource(document), new javax.xml.transform.stream.StreamResult("src/person.xml"));
}
注意:在添加完畢之後,元素不會添加到文件中,只會添加內存中,這時需要使用方法回寫。
使用jaxp 修改節點
修改第一個P1下面的sex的內容是男:
publicstaticvoid update() throws ParserConfigurationException,SAXException, IOException, TransformerException {
//修改第一個P1裏面的值爲男
//創建解析器工廠
DocumentBuilderFactory document1 = DocumentBuilderFactory.newInstance();
//創建解析器
DocumentBuilder document = document1.newDocumentBuilder();
//創建document
Document docu = document.parse("src/person.xml");
//得到P1
Node list = docu.getElementsByTagName("sex").item(0);
//修改
list.setTextContent("nan");
//回寫xml
TransformerFactory trans= TransformerFactory.newInstance();
Transformer tran = trans.newTransformer();
tran.transform(new DOMSource((docu)), new javax.xml.transform.stream.StreamResult("src/person.xml"));}
刪除sex
publicstaticvoid deny() throws ParserConfigurationException,SAXException, IOException, TransformerException {
//創建解析器工廠
DocumentBuilderFactory document1 = DocumentBuilderFactory.newInstance();
//創建解析器
DocumentBuilder document = document1.newDocumentBuilder();
//創建document
Document docu = document.parse("src/person.xml");
//得到sex
Node sex1 = docu.getElementsByTagName("sex").item(0);
//得到sex的父節點
Node p1 =sex1.getParentNode();
//刪除
p1.removeChild(sex1);
//回寫
TransformerFactory trans = TransformerFactory.newInstance();
Transformer tran = trans.newTransformer();
tran.transform(new DOMSource((docu)), new javax.xml.transform.stream.StreamResult("src/person.xml"));
}
使用jaxp遍歷節點
把所有的元素的名稱都打印出來
注意:遍歷之後打印出來的會有空格等其他的內容,需要先判斷是否是元素
publicstaticvoid listElement() throwsException{
//創建解析器工廠
DocumentBuilderFactory document1 = DocumentBuilderFactory.newInstance();
//創建解析器
DocumentBuilder document = document1.newDocumentBuilder();
//創建document
Document docu = document.parse("src/person.xml");
//編寫一個遞歸方法實現遍歷操作
list1(docu);
}
//遞歸遍歷
privatestaticvoid list1(Node node) {
//判斷是元素類型的時候纔打印
if(node.getNodeType()==Node.ELEMENT_NODE) {
System.out.println(node.getNodeName());
}
//得到一層子節點
NodeList list = node.getChildNodes();
for(inti = 0; i<list.getLength();i++) {
//得到每一個節點
Node node1 = list.item(i);
list1(node1);
}
}
Xml的schema約束
det約束語法:<! ELEMENT 元素名稱 約束>
**schema符合xml的語法規範,一個xml中可以有多個schema,多個schema使用名稱空間來進行區分(類似於包名),dtd裏面有PCTATA類型,但是schema中可以支持更多的數據類型,比如 年齡 只能是整數,在schema可以直接定義一個整數類型,語法更加的複雜。
schema的快速入門:
創建一個schema文件:後綴值 .xsd
在schema裏面有屬性 xmlns=http://www.w3.org/2001/XMLSchema
表示xml文件是約束文件
targetNamespace=http://www.example.org/1
使用schema約束直接通過這個地址引入約束文件
elementFormDefault="qualified"
表示質量良好的
步驟:1,看xml文件只中有多少個元素就寫多少個<element>
<element name="person">//複雜元素
<complexType>
<sequence>
<element name="name"type="string"></element>簡單
<element name="age"type="int"></element> 簡單元素
</sequence>
</complexType>
</element>
在被約束文件中引入
<?xml version="1.0"encoding="UTF-8" standalone="no"?>
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.example.org/1"
xsi:xsi:schemaLocation="http://www.example.org/1 1.xsd">
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
表示xml是一個被約束的文件
xmlns="http://www.example.org/1"
約束文檔裏面的targetNamespace的值
引入的文件名 |
targetNamespace的值 |
xsi:schemaLocation="http://www.example.org/1 1.xsd">