更新時間:2021-08-19 11:21:54 來源:動力節點 瀏覽914次
1.XML全名為可擴展標記語言(eXtensible Markup Language),是w3c組織的一個技術規范,具有嚴格的數據格式,主要作用是描述數據并集中于數據的內容。
2.XML的主要用途:
(1)作為小型數據庫存儲數據,office軟件貌似就是這么用xml存儲數據。
(2)作為配置文件,存儲相關的配置信息,如spring、mybatis等框架的配置文件。
(3)作為傳輸數據的載體,如webservice。不過由于xml的數據格式冗余太多,沒有json高效簡潔。
1.xml的文檔聲明 :
該聲明不是必需,如果有則會在xml文檔的第一行。 該聲明有三個鍵值對,version表示版本號,encoding表示該文檔使用的字符集編碼,standalone表示是否可以在不讀取其他文件的情況下處理該文檔。
2.xml注釋 :<!-- 注釋內容 -->
3.標簽 <標簽><標簽/> 、<標簽/>
(1)標簽區分大小寫
(2)標簽不能以數字或下劃線開頭、不能以xml開頭、不能包含空格
(3)標簽中所有的空格和換行都會當作標簽內容來處理
4.xml中的轉義字符
5.將內容原樣輸出
如果一個XML文件的語法符合W3C的規范,這該XML是一個良好的XML。如果一個良好的XML通過了用戶自定義的DTD和Schema的校驗約束,則稱這個XML為有效的XML。
XML的約束分為兩種,DTD約束和Schema約束
1.DTD約束 : 文檔類型定義(Document Type Definition,簡稱DTD)
(1)DTD的作用
DTD定義了XML文檔內容的結構,保證XML以一致的格式存儲數據
XML允許用戶為應用程序創建自己的DTD
通過DTD定義的詞匯表以及文檔語法,XML解析器可以檢查XML文檔內容的有效性
(2)如何引入DTD
內部編寫:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 班級 [
<!ELEMENT 班級 (學生+)>
<!ELEMENT 學生 (姓名,性別,年齡)>
<!ELEMENT 姓名 (#PCDATA)>
<!ELEMENT 性別 (#PCDATA)>
<!ELEMENT 年齡 (#PCDATA)>
]>
<班級>
<學生>
<姓名>小明</姓名>
<性別>男</性別>
<年齡>67</年齡>
</學生>
...
</班級>
外部引入本地約束文件:<!DOCTYPE 文檔根結點 SYSTEM "DTD文件的URL">
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books SYSTEM "F:/eclipseWorkSpace/testProject/src/testxml/book.dtd">
<books>
<book id="001" name="紅樓夢">
<price>10.0</price>
</book>
<book id="002" name="三國演義">
<price>11.0</price>
</book>
<book id="003" name="西游記">
<price>12.0</price>
</book>
<book id="004" name="水滸傳">
<price>13.0</price>
</book>
</books>
<!--DTD約束文件book.dtd-->
<?xml version="1.0" encoding="UTF-8" ?>
<!ELEMENT books (book)?>
<!ELEMENT book (price)?>
<!ATTLIST book
id ID #REQUIRED
name CDATA #REQUIRED
>
<!ELEMENT price (#PCDATA)>
外部引入公共約束文件:<!DOCTYPE 文檔根結點 PUBLIC "DTD名稱" "DTD文件的URL">
DOM解析:將XML文件加載進內存,構建DOM樹,這樣可以隨意存取和修改文件樹的任何部分,沒有次數限制,并且易于開發,但不適合大型的XML文件。
SAX解析:類似于流媒體的特點,能夠立即對XML進行分析,而不是等待所有數據都加載完成。SAX解析是基于事件的模型,它在解析的過程中可以觸發一系列的事件,然后激活回調方法進行處理,并且不能對XML進行修改操作。
SAX只能按照順序進行解析,并且占用內存較小,適合大型XML文件。
JAXP(Java API for XML Processing,意為XML處理的Java API)是Java XML程序設計的應用程序接口之一,它提供解析和驗證XML文檔的能力。DOM解析和SAX解析是兩種思想,JAXP是java對其的具體實踐。
JDOM 實現了JAVA自己的文檔模型,其效率比JAXP的DOM解析要快,JDOM自身不包含解析器。它通常使用SAX2解析器來解析和驗證輸入XML文檔。JDOM還是要構建DOM樹,所以對超大型XML文件還是不太適合。
DOM4J 是一個非常非常優秀的Java XML API,具有性能優異、功能強大和極端易用使用的特點,并且具有更好的性能,同樣也是不適合大型的XML文件。
StAX 是一個基于JAVA API用于解析XML文檔,類似SAX解析器的方式。StAX是PULL API,其中作為SAX是PUSH API。這意味著如果StAX解析器,客戶端應用程序需要詢問StAX解析器從XML獲取信息它所需要的,但如果是SAX解析器,客戶端應用程序需要獲取信息時,SAX解析器會通知客戶端應用程序的信息是可用的。StAX的API可以讀取和寫入XML文檔。
代碼示例:
public class TestJAXP {
public static void main(String[] args) throws Exception{
//jaxpDom();
jaxpSax();
}
public static void jaxpDom() throws Exception{
//讀取xml文檔
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new FileInputStream(new File("F:/eclipseWorkSpace/testProject/src/testxml/book.xml")));
String version = document.getXmlVersion();
System.out.println(version);
System.out.println(document.getNodeName());
Node rootNode = document.getDocumentElement();
System.out.println(rootNode.getNodeName() + "==" +(rootNode.getNodeType()== Node.ELEMENT_NODE));
NodeList childNodes = rootNode.getChildNodes();
int lenght = childNodes.getLength();
for(int i=0;i<lenght;i++){
Node childNode = childNodes.item(i);
if(childNode.getNodeType() == Node.ELEMENT_NODE){
System.out.println(childNode.getNodeName() +"=="+ childNode.getNodeType());
System.out.println(childNode.getTextContent());
NamedNodeMap attributes = childNode.getAttributes();
for(int j=0 ; j<attributes.getLength();j++){
Node attr = attributes.item(j);
System.out.println(attr.getNodeName() + "==" + attr.getNodeValue());
}
}
}
Element book = document.createElement("book");
book.setAttribute("id", "005");
book.setAttribute("name", "XXX");
Element privce = document.createElement("price");
privce.setTextContent("15.01");
book.appendChild(privce);
rootNode.appendChild(book);
//輸出xml
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer tf = tFactory.newTransformer();
tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("F:/eclipseWorkSpace/testProject/src/testxml/book2.xml")));
}
public static void jaxpSax() throws Exception{
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
XMLReader xmlReader = parser.getXMLReader();
//XMLReader xmlReader = XMLReaderFactory.createXMLReader();//這種方式獲取xmlReader也可以
xmlReader.setContentHandler(new BookParser());
xmlReader.parse(new InputSource(new FileInputStream("F:/eclipseWorkSpace/testProject/src/testxml/book2.xml")));
}
}
class BookParser extends DefaultHandler{
@Override
public void startDocument() throws SAXException {
System.out.println("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
StringBuilder sb = new StringBuilder();
sb.append("<").append(qName);
for(int i=0;i<attributes.getLength();i++){
sb.append(" \"").append(attributes.getLocalName(i)).append("\"=").append(attributes.getValue(i));
}
sb.append(">");
System.out.print(sb);
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.print("</"+qName+">");
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String cnt = new String(ch,start,length);
System.out.print(cnt);
}
}
public class TestDom4J {
public static void main(String[] args) throws Exception {
String url = "F:/eclipseWorkSpace/testProject/src/testxml/book3.xml";
getInfo(url);
//updateXml(url);
}
@SuppressWarnings("unchecked")
public static void getInfo(String url) throws DocumentException{
SAXReader reader = new SAXReader();
Document document = reader.read(new File(url));
Element rootNode = document.getRootElement();
System.out.println(rootNode.getName());
List<Element> elements = rootNode.elements();
for(Element n : elements){
System.out.println(n.getName());
List<Attribute> attributes = n.attributes();
for(Attribute attr : attributes){
System.out.println(attr.getName()+"==="+attr.getValue());
}
}
}
public static void updateXml(String url) throws Exception{
SAXReader reader = new SAXReader();
Document document = reader.read(new File(url));
Element rootNode = document.getRootElement();
Element book = rootNode.addElement("book");
book.addAttribute("id", "005");
book.addAttribute("name","封神榜");
Element price = book.addElement("price");
price.setText("123.1");
OutputFormat format = OutputFormat.createCompactFormat();
format.setEncoding("UTF-8");
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(url),format);
xmlWriter.write(document);
xmlWriter.close();
}
}
public class TestStAX {
public static void main(String[] args) throws FileNotFoundException, XMLStreamException {
String url = "F:/eclipseWorkSpace/testProject/src/testxml/book.xml";
getInfo(url);
}
public static void getInfo(String url) throws FileNotFoundException, XMLStreamException{
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader reader = factory.createXMLStreamReader(new FileInputStream(url));
while(reader.hasNext()){
int event = reader.next();
if(event == XMLStreamConstants.START_ELEMENT ){
StringBuilder sb = new StringBuilder();
sb.append("<").append(reader.getLocalName());
for(int i=0;i<reader.getAttributeCount();i++){
sb.append(" \"").append(reader.getAttributeLocalName(i)).append("\"=").append(reader.getAttributeValue(i));
}
sb.append(">");
System.out.print(sb);
}
if(event == XMLStreamConstants.END_ELEMENT){
System.out.print("</"+reader.getLocalName()+">");
}
if(event == XMLStreamConstants.CHARACTERS){
System.out.print(reader.getText());
}
}
}
}
以上就是動力節點小編介紹的"解析XML",希望對大家有幫助,想了解更多可查看Java在線學習。動力節點在線學習教程,針對沒有任何Java基礎的讀者學習,讓你從入門到精通,主要介紹了一些Java基礎的核心知識,讓同學們更好更方便的學習和了解Java編程,感興趣的同學可以關注一下。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習