1. 程式人生 > >XML系統學習

XML系統學習

基本概念 放置 mage 自己 names 網頁 如果 end space

參考: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 個預定義的實體引用:

&lt; < 小於
&gt; > 大於
&amp; & 和號
&apos; ‘ 省略號
&quot; " 引號

<message>if salary < 1000 then</message> 錯誤
<message>if salary &lt; 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系統學習