XML系統學習
參考:W3School
XML基本概念
1.XML是eXtensible Markup Language,使用DTD(Document Type Definition)來描述數據,主要是為傳輸和存儲數據,其焦點是數據的內容。
2.所有XML元素都必須正確地關閉,XML標簽對大小寫敏感,沒有預定義的標簽(eg:<h1>),XML文檔必須有根標簽,XML元素必須被正確地嵌套,XML 元素是可擴展。XML可保留空白字符,必須使用引號包圍XML的屬性值
3.XML 元素必須遵循以下命名規則:1)名稱可以含字母、數字以及其他的字符名稱;2)不能以數字或者標點符號開始;3)名稱不能以字符 “xml”(或者 XML、Xml)開始;4)名稱不能包含空格
4.XML註釋 <!-- This is a comment -->
5. CDATA 指的是不應由 XML 解析器進行解析的文本數據(Unparsed Character Data),忽略這部分內容的正確語法是:<![CDATA[ Text to be ignored ]]>
6.在 XML 中有 5 個預定義的實體引用:
< < 小於
> > 大於
& & 和號
' ‘ 省略號
" " 引號
<message>if salary < 1000 then</message> 錯誤
<message>if salary < 1000 then</message> 正確
XML特點
1.命名空間:元素名稱是由開發者定義的,當兩個不同的文檔使用相同的元素名時,就會發生命名沖突。XML 命名空間屬性被放置於元素的開始標簽之中,並使用以下的語法:xmlns:namespace-prefix="namespaceURI"
<h:table xmlns:h="http://www.w3.org/TR/html4/"> <h:tr> <h:td>Apples</h:td> <h:td>Bananas</h:td> </h:tr> </h:table>
2.XML DOM:定義了所有 XML 元素的對象和屬性,以及訪問它們的方法(接口)
DOM特性:
整個文檔是一個文檔節點
每個 XML 標簽是一個元素節點
包含在 XML 元素中的文本是文本節點
每一個 XML 屬性是一個屬性節點
註釋屬於註釋節點
DOM屬性:x表示一個節點對象
- x.nodeName - x 的名稱
- x.nodeValue - x 的值
- x.parentNode - x 的父節點
- x.childNodes - x 的子節點
- x.attributes - x 的屬性節點
DOM方法:x表示一個節點對象
- x.getElementsByTagName(name) - 獲取帶有指定標簽名稱的所有元素
- x.appendChild(node) - 向 x 插入子節點
- x.removeChild(node) - 從 x 刪除子節點
Tips:DOM 處理中的普遍錯誤,認為元素節點包含文本。<year>2005</year>,元素節點 <year>,擁有一個值為 "2005" 的文本節點,"2005" 不是 <year> 元素的值!
<?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book category="children"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="web"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> <book category="Literature "> <title >托斯卡納艷陽下</title> <author>弗朗西絲·梅耶斯</author> <year>2006</year> <price>29.8</price> </book> </bookstore>
說明:根節點 <bookstore> 有四個 <book> 節點,每個 <book> 節點有四個子節點:<title>, <author>, <year> 以及 <price>,其中每個節點都包含一個文本節點,"Harry Potter", "J K. Rowling", "2005" 以及 "29.99"
創建XML文件
基於python語言,調用xml.dom模塊創建xml的API
#coding=utf-8 import xml.dom.minidom #在內存中創建一個空的文檔 doc = xml.dom.minidom.Document() #創建一個根節點bookstore對象,名為root root = doc.createElement(‘bookstore‘) #設置根節點的屬性 root.setAttribute(‘name‘, ‘Sisyphe Bookstore‘) root.setAttribute(‘address‘, ‘老街‘) #將根節點添加到文檔對象中 doc.appendChild(root) bookList = [{‘title‘ : ‘Harry Potter‘,‘author‘ : ‘J K. Rowling‘, ‘year‘ : 2005,‘price‘:29.99}, {‘title‘ : ‘Learning XML‘,‘author‘ : ‘Erik T. Ray‘, ‘year‘ : 2003,‘price‘:39.95}, {‘title‘ : ‘托斯卡納艷陽下‘,‘author‘ : ‘弗朗西絲·梅耶斯‘, ‘year‘ : 2006,‘price‘:29.8} ] for i in bookList : nodeBookstore = doc.createElement(‘bookstore‘) nodeTitle = doc.createElement(‘title‘) nodeTitle.appendChild(doc.createTextNode(str(i[‘title‘]))) #給葉子節點name設置一個文本節點,用於顯示文本內容 nodeAuthor = doc.createElement("author") nodeAuthor.appendChild(doc.createTextNode(str(i["author"]))) nodeYear = doc.createElement("year") nodeYear.appendChild(doc.createTextNode(str(i["year"]))) nodePrice = doc.createElement("price") nodePrice.appendChild(doc.createTextNode(str(i["price"]))) #將各葉子節點添加到父節點bookstore中, nodeBookstore.appendChild(nodeTitle) nodeBookstore.appendChild(nodeAuthor) nodeBookstore.appendChild(nodeYear) nodeBookstore.appendChild(nodePrice) root.appendChild(nodeBookstore) #最後將bookstore添加到根節點root中 #開始寫xml文檔 fp = open(‘C:\Users\HP\Desktop\BookStore.xml‘, ‘w‘) doc.writexml(fp, indent=‘\t‘, addindent=‘\t‘, newl=‘\n‘, encoding="utf-8")
解析源碼:
1.minidom.Document() 創建一個空白xml文檔樹對象。每個xml文檔都是一個Document對象,代表著內存中的DOM樹
2.doc. createElement(tagName) 創建xml文檔節點,參數表示要生成節點的名稱
3.node.setAttribute(attname, value) 給節點添加屬性值對(Attribute)
4.doc.createTextNode(data) 給葉子節點添加文本節點
5.node.appendChild(nodeName) 將某個節點添加到節點node下
6.writexml(writer, indent, addindent, newl, encoding) 將內存中xml文檔樹寫入文件中
writer是文件對象
indent是每個tag前填充的字符,如:’ ‘,則表示每個tag前有兩個空格
addindent是每個子結點的縮近字符
newl是每個tag後填充的字符,如:’\n’,則表示每個tag後面有一個回車
encoding是生成的XML信息頭中的encoding屬性值,在輸出時minidom並不真正進行編碼的處理,如果你保存的文本內容中有漢字,則需要自已進行編碼轉換。
writexml方法是除了writer參數必須要有外,其余可以省略。
輸出結果:
沒有編碼問題,給自己一個蜜汁微笑
乏善可陳的下午,Happy Ending!
XML系統學習