1、XML:可拓展標記語言。用來描述生活中大量數據之間的關係
例如:<a>
<b>
<d></d>
</b>
<c>
</c>
</a>
關係:a下面有bc,b下面有d.
2、XML語法:文檔聲明
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
version:版本號
encoding:編碼格式
standalone:是否獨立
(1)元素:標籤,命名規範
(2)屬性
(3)註釋:註釋不能再文檔聲明之前。
(4)<![CDATA[內容]]>:cdata區,直接顯示內容,不進行解析。
(5)命令:<?xml-stylesheet type="text/css" herf="01.css"?>
3、XML約束:dtd
<!ELEMENT 書架 (書+)>
<!ELEMENT 書 (書名,作者)>
<!ELEMENT 書名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
DOCTYPE : 聲明所遵循的DTD文件
<!DOCTYPE 書架 SYSTEM "文件名" >
<!ELEMENT 元素 元素(any enpty)類型或者內容>
<!ATTLIST 元素名
屬性名 屬性類型(CDATA、枚舉、ID:設置屬性爲唯一值、ENTITY:實體) 設置說明(REQUIERD:必須的、IMPLIED:可選的、FIXED:固定的、默認值)>
引用實體:XML文檔所用的(<!ENTITY copy "nihaoya"> -->©)
參數實體:用在DTD中(<!ENTITY % copy "nisdlk"> --> % copy)
4、XML解析
(1)解析方式分爲dom和sax
(2)調整jvm內存大小:點擊項目的run configuration
(3)jaxp對XML進行dom解析:
A、讀取XML所有節點
@Test
public void read() throws Exception{
//獲取工廠
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//得到dom解析器
DocumentBuilder builder = factory.newDocumentBuilder();
//獲得文檔
Document doc = builder.parse("src/book.xml");
Node node1 = doc.getElementsByTagName("書架").item(0);//獲取書架標籤
list(node1);
}
private void list(Node node1) {
if(node1 instanceof Element){
System.out.println(node1.getNodeName());
}
NodeList list1 = node1.getChildNodes();
for(int i=0;i<list1.getLength();i++){
list(list1.item(i));
}
}
B、添加節點
@Test
public void add() throws Exception{
//獲取工程
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//得到dom解析器
DocumentBuilder builder = factory.newDocumentBuilder();
//獲得文檔
Document doc = builder.parse("src/book.xml");
Element element = doc.createElement("售價");
element.setAttribute("nihao", "shiwo");
element.setTextContent("bbb");
Node node = doc.getElementsByTagName("書").item(0);
node.appendChild(element);
//node.insertBefore(newChild, refChild)
//寫回文檔
TransformerFactory tffactory = TransformerFactory.newInstance();
Transformer trans = tffactory.newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(new FileOutputStream("src/book.xml")));
}
C、刪除節點
@Test
public void delete() throws Exception{
//獲取工程
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//得到dom解析器
DocumentBuilder builder = factory.newDocumentBuilder();
//獲得文檔
Document doc = builder.parse("src/book.xml");
Element ele = (Element) doc.getElementsByTagName("售價").item(0);
ele.getParentNode().removeChild(ele);
//寫回文檔
TransformerFactory tffactory = TransformerFactory.newInstance();
Transformer trans = tffactory.newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(new FileOutputStream("src/book.xml")));
}
(4)jaxp對XML文檔進行sax解析
A、獲取XML文檔內容
@Test
public void test01() throws Exception{
//獲取解析工廠
SAXParserFactory factory = SAXParserFactory.newInstance();
//獲取解析器
SAXParser parser = factory.newSAXParser();
//獲取讀取器
XMLReader reader = parser.getXMLReader();
//設置內容讀取器
reader.setContentHandler(new XMLHandler());
//讀取XML文檔
reader.parse("src/book.xml");
}
//獲取所有標籤
class XMLHandler extends DefaultHandler{
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.println("<"+qName+">");
for(int i = 0;attributes!=null&&i<attributes.getLength();i++){
System.out.println(attributes.getQName(i)+"="+attributes.getValue(i));
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("</"+qName+">");
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.println(new String(ch,start,length));
}
}
//獲取特定的標籤的處理器
class TagHandler extends DefaultHandler{
private String current_tag;
private int num=2;
private int currentNum;
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
current_tag= qName;
if("作者".equals(current_tag)){
currentNum++;
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
current_tag=null;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if("作者".equals(current_tag)&¤tNum==num){
System.out.println(new String(ch,start,length));
}
}
}
//解析JavaBean的處理器
class BeanHandler extends DefaultHandler{
private List<Book> list =new ArrayList<Book>();
private String current_tag;
private Book book1;
public List<Book> getList() {
return list;
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
current_tag=qName;
if("書".equals(current_tag)){
book1 = new Book();
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
if("書".equals(qName)){
list.add(book1);
book1=null;
}
current_tag=null;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if("書名".equals(current_tag)){
book1.setName(new String(ch,start,length));
}
if("作者".equals(current_tag)){
book1.setAuthor(new String(ch,start,length));
}
if("價格".equals(current_tag)){
book1.setPrice(new String(ch,start,length));
}
}
}
(5)dom4j對XML進行解析:需要導入包
A、讀取文檔的指定標籤
@Test
public void read() throws Exception{
//讀取器
SAXReader reader = new SAXReader();
//獲取文檔
Document document = reader.read("src/book.xml");
//獲取根節點
Element ele = document.getRootElement();
//獲取根節點下面的元素
Element book = (Element) ele.elements("書").get(1);
//獲取需要的內容
String value = book.element("書名").getText();
System.out.println(value);
}
B、添加結點
@Test
public void add() throws Exception{
SAXReader reader = new SAXReader();
Document doc = reader.read("src/book.xml");
Element ele = doc.getRootElement();
Element book = ele.element("書");
book.addElement("售價").addAttribute("aaa", "bbbb").addText("2002");
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
//寫回
XMLWriter writer = new XMLWriter( new FileOutputStream( "src/book.xml" ), format );
writer.write( doc );
writer.close();
}
(6)XPath
得到特定的書名下的內容,查看文檔
@Test
public void test01() throws Exception{
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("src/book.xml"));
String value = doc.selectSingleNode("//書名").getText();
System.out.println(value);
}
(7)schema
查看w3c文檔