當前位置:首頁 » 編程語言 » pythonsgmlparser

pythonsgmlparser

發布時間: 2024-12-01 04:10:19

1. xml是什麼格式

簡單地說明一下吧。
首先是ASP與HTML的關系,希望樓主能夠明白兩者的關系。HTML的主要功能就是顯示數據,也就是說網頁的內容。HTML定義了許多標簽,提供了數據的顯示方式,哪些是顯示為段落,哪些顯示為標題,哪些顯示為表格等等。而ASP是動態地生成HTML,用戶需要瀏覽什麼數據,ASP就把這些數據組織成HTML來顯示出來,最常見的情況就是ASP能夠從資料庫中提取數據並用HTML向用戶表示出來。由此,這可能發生一件事,也許你看了好幾個內容不同的網頁,但它們可能都是一個asp文件生成的。

而xml則側重於管理數據,更具體地說是分類數據(這是它的主要功能之一)。也許從一個HTML上看不出數據之間的關系,兩個HTML段落可能一個段落是一本書的標題,另一個段落可能是一本書的序言。這一切用HTML表示都無法說明它們的關系。而XML可以做到這一點,因為它的標簽可以由用戶定義,如一本書的標題可以定義為title標簽,內容可以定義為content標簽。這樣數據之間的關系就很明顯。

但xml文件無法提供顯示方式,因為瀏覽器並不知道這些標簽要用什麼來顯示,即使可以使用css或者xsl來定義顯示,但xml還是很少用來顯示,它還是側重於管理數據,顯示數據的任務還是由html擔任,因此xml會取代html恐怕不會實現。不過在html中已經可以實現從xml中提取數據並顯示出來,這樣它們的分工就更加明顯了。

2. 用python解析XML的幾種常見方法的介紹


一、簡介

XML(eXtensible Markup Language)指可擴展標記語言,被設計用來傳輸和存儲數據,已經日趨成為當前許多新生技術的核心,在不同的領域都有著不同的應用。它是web發展到一定階段的必然產物,既具有SGML的核心特徵,又有著HTML的簡單特性,還具有明確和結構良好等許多新的特性。
python解析XML常見的有三種方法:一是xml.dom.*模塊,它是W3C DOM API的實現,若需要處理DOM API則該模塊很適合,注意xml.dom包裡面有許多模塊,須區分它們間的不同;二是xml.sax.*模塊,它是SAX API的實現,這個模塊犧牲了便捷性來換取速度和內存佔用,SAX是一個基於事件的API,這就意味著它可以「在空中」處理龐大數量的的文檔,不用完全載入進內存;三是xml.etree.ElementTree模塊(簡稱 ET),它提供了輕量級的Python式的API,相對於DOM來說ET 快了很多,而且有很多令人愉悅的API可以使用,相對於SAX來說ET的ET.iterparse也提供了 「在空中」 的處理方式,沒有必要載入整個文檔到內存,ET的性能的平均值和SAX差不多,但是API的效率更高一點而且使用起來很方便。
二、詳解

解析的xml文件(country.xml):
在CODE上查看代碼片派生到我的代碼片

4
2011
59900
68
2011
13600


1、xml.etree.ElementTree

ElementTree生來就是為了處理XML,它在Python標准庫中有兩種實現:一種是純Python實現的,如xml.etree.ElementTree,另一種是速度快一點的xml.etree.cElementTree。注意:盡量使用C語言實現的那種,因為它速度更快,而且消耗的內存更少。
在CODE上查看代碼片派生到我的代碼片

try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET


這是一個讓Python不同的庫使用相同API的一個比較常用的辦法,而從Python 3.3開始ElementTree模塊會自動尋找可用的C庫來加快速度,所以只需要import xml.etree.ElementTree就可以了。
在CODE上查看代碼片派生到我的代碼片

#!/usr/bin/evn python
#coding:utf-8

try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET
import sys

try:
tree = ET.parse("country.xml") #打開xml文檔
#root = ET.fromstring(country_string) #從字元串傳遞xml
root = tree.getroot() #獲得root節點
except Exception, e:
print "Error:cannot parse file:country.xml."
sys.exit(1)
print root.tag, "---", root.attrib
for child in root:
print child.tag, "---", child.attrib

print "*"*10
print root[0][1].text #通過下標訪問
print root[0].tag, root[0].text
print "*"*10

for country in root.findall('country'): #找到root節點下的所有country節點
rank = country.find('rank').text #子節點下節點rank的值
name = country.get('name') #子節點下屬性name的值
print name, rank

#修改xml文件
for country in root.findall('country'):
rank = int(country.find('rank').text)
if rank > 50:
root.remove(country)

tree.write('output.xml')


運行結果:




參考:https://docs.python.org/2/library/xml.etree.elementtree.html
2、xml.dom.*

文件對象模型(Document Object Model,簡稱DOM),是W3C組織推薦的處理可擴展置標語言的標准編程介面。一個 DOM 的解析器在解析一個XML文檔時,一次性讀取整個文檔,把文檔中所有元素保存在內存中的一個樹結構里,之後你可以利用DOM 提供的不同的函數來讀取或修改文檔的內容和結構,也可以把修改過的內容寫入xml文件。python中用xml.dom.minidom來解析xml文件,例子如下:
在CODE上查看代碼片派生到我的代碼片

#!/usr/bin/python
#coding=utf-8

from xml.dom.minidom import parse
import xml.dom.minidom

# 使用minidom解析器打開XML文檔
DOMTree = xml.dom.minidom.parse("country.xml")
Data = DOMTree.documentElement
if Data.hasAttribute("name"):
print "name element : %s" % Data.getAttribute("name")

# 在集合中獲取所有國家
Countrys = Data.getElementsByTagName("country")

# 列印每個國家的詳細信息
for Country in Countrys:
print "*****Country*****"
if Country.hasAttribute("name"):
print "name: %s" % Country.getAttribute("name")

rank = Country.getElementsByTagName('rank')[0]
print "rank: %s" % rank.childNodes[0].data
year = Country.getElementsByTagName('year')[0]
print "year: %s" % year.childNodes[0].data
gdppc = Country.getElementsByTagName('gdppc')[0]
print "gdppc: %s" % gdppc.childNodes[0].data

for neighbor in Country.getElementsByTagName("neighbor"):
print neighbor.tagName, ":", neighbor.getAttribute("name"), neighbor.getAttribute("direction")


運行結果:




參考:https://docs.python.org/2/library/xml.dom.html

3、xml.sax.*

SAX是一種基於事件驅動的API,利用SAX解析XML牽涉到兩個部分:解析器和事件處理器。其中解析器負責讀取XML文檔,並向事件處理器發送事件,如元素開始跟元素結束事件;而事件處理器則負責對事件作出相應,對傳遞的XML數據進行處理。python中使用sax方式處理xml要先引入xml.sax中的parse函數,還有xml.sax.handler中的ContentHandler。常使用在如下的情況下:一、對大型文件進行處理;二、只需要文件的部分內容,或者只需從文件中得到特定信息;三、想建立自己的對象模型的時候。
ContentHandler類方法介紹
(1)characters(content)方法
調用時機:
從行開始,遇到標簽之前,存在字元,content的值為這些字元串。
從一個標簽,遇到下一個標簽之前, 存在字元,content的值為這些字元串。
從一個標簽,遇到行結束符之前,存在字元,content的值為這些字元串。
標簽可以是開始標簽,也可以是結束標簽。
(2)startDocument()方法
文檔啟動的時候調用。
(3)endDocument()方法
解析器到達文檔結尾時調用。
(4)startElement(name, attrs)方法
遇到XML開始標簽時調用,name是標簽的名字,attrs是標簽的屬性值字典。
(5)endElement(name)方法
遇到XML結束標簽時調用。
在CODE上查看代碼片派生到我的代碼片

#coding=utf-8
#!/usr/bin/python

import xml.sax

class CountryHandler(xml.sax.ContentHandler):
def __init__(self):
self.CurrentData = ""
self.rank = ""
self.year = ""
self.gdppc = ""
self.neighborname = ""
self.neighbordirection = ""

# 元素開始事件處理
def startElement(self, tag, attributes):
self.CurrentData = tag
if tag == "country":
print "*****Country*****"
name = attributes["name"]
print "name:", name
elif tag == "neighbor":
name = attributes["name"]
direction = attributes["direction"]
print name, "->", direction

# 元素結束事件處理
def endElement(self, tag):
if self.CurrentData == "rank":
print "rank:", self.rank
elif self.CurrentData == "year":
print "year:", self.year
elif self.CurrentData == "gdppc":
print "gdppc:", self.gdppc
self.CurrentData = ""

# 內容事件處理
def characters(self, content):
if self.CurrentData == "rank":
self.rank = content
elif self.CurrentData == "year":
self.year = content
elif self.CurrentData == "gdppc":
self.gdppc = content

if __name__ == "__main__":
# 創建一個 XMLReader
parser = xml.sax.make_parser()
# turn off namepsaces
parser.setFeature(xml.sax.handler.feature_namespaces, 0)

# 重寫 ContextHandler
Handler = CountryHandler()
parser.setContentHandler(Handler)

parser.parse("country.xml")


運行結果:




4、libxml2和lxml解析xml

libxml2是使用C語言開發的xml解析器,是一個基於MIT License的免費開源軟體,多種編程語言都有基於它的實現,python中的libxml2模塊有點小不足的是:xpathEval()介面不支持類似模板的用法,但不影響使用,因libxml2採用C語言開發的,因此在使用API介面的方式上難免會有點不適應。
在CODE上查看代碼片派生到我的代碼片

#!/usr/bin/python
#coding=utf-8

import libxml2

doc = libxml2.parseFile("country.xml")
for book in doc.xpathEval('//country'):
if book.content != "":
print "----------------------"
print book.content
for node in doc.xpathEval("//country/neighbor[@name = 'Colombia']"):
print node.name, (node.properties.name, node.properties.content)
doc.freeDoc()




lxml是以libxml2為基礎採用python語言開發的,從使用層面上說比lxml更適合python開發者,且xpath()介面支持類似模板的用法。
在CODE上查看代碼片派生到我的代碼片

#!/usr/bin/python
#coding=utf-8

import lxml.etree

doc = lxml.etree.parse("country.xml")
for node in doc.xpath("//country/neighbor[@name = $name]", name = "Colombia"):
print node.tag, node.items()
for node in doc.xpath("//country[@name = $name]", name = "Singapore"):
print node.tag, node.items()




三、總結
(1)Python中XML解析可用的類庫或模塊有xml、libxml2 、lxml 、xpath等,需要深入了解的還需參考相應的文檔。
(2)每一種解析方式都有自己的優點和缺點,選擇前可以綜合各個方面的性能考慮。
(3)若有不足,請留言,在此先感謝!

3. 如何在JS中實現相互轉換XML和JSON

JSON與XML的區別比較

1.定義介紹

(1).XML定義

擴展標記語言 (Extensible Markup Language, XML)
,用於標記電子文件使其具有結構性的標記語言,可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言。
XML使用DTD(document type definition)文檔類型定義來組織數據;格式統一,跨平台和語言,早已成為業界公認的標准。
XML是標准通用標記語言 (SGML) 的子集,非常適合 Web 傳輸。XML 提供統一的方法來描述和交換獨立於應用程序或供應商的結構化數據。

(2).JSON定義

JSON(javaScript Object
Notation)一種輕量級的數據交換格式,具有良好的可讀和便於快速編寫的特性。可在不同平台之間進行數據交換。JSON採用兼容性很高的、完全獨立於語言文本格式,同時也具備類似於C語言的習慣(包括C,
C++, C#, Java, JavaScript, Perl, Python等)體系的行為。這些特性使JSON成為理想的數據交換語言。
JSON基於JavaScript Programming Language , Standard ECMA-262 3rd Edition - December 1999 的一個子集。

2.XML和JSON優缺點

(1).XML的優缺點

<1>.XML的優點
A.格式統一,符合標准;
B.容易與其他系統進行遠程交互,數據共享比較方便。

<2>.XML的缺點
A.XML文件龐大,文件格式復雜,傳輸占帶寬;
B.伺服器端和客戶端都需要花費大量代碼來解析XML,導致伺服器端和客戶端代碼變得異常復雜且不易維護;
C.客戶端不同瀏覽器之間解析XML的方式不一致,需要重復編寫很多代碼;
D.伺服器端和客戶端解析XML花費較多的資源和時間。

(2).JSON的優缺點

<1>.JSON的優點:
A.數據格式比較簡單,易於讀寫,格式都是壓縮的,佔用帶寬小;

B.易於解析,客戶端JavaScript可以簡單的通過eval()進行JSON數據的讀取;

C.支持多種語言,包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等伺服器端語言,便於伺服器端的解析;

D.在PHP世界,已經有PHP-JSON和JSON-PHP出現了,偏於PHP序列化後的程序直接調用,PHP伺服器端的對象、數組等能直接生成JSON格式,便於客戶端的訪問提取;

E.因為JSON格式能直接為伺服器端代碼使用,大大簡化了伺服器端和客戶端的代碼開發量,且完成任務不變,並且易於維護。

<2>.JSON的缺點

A.沒有XML格式這么推廣的深入人心和喜用廣泛,沒有XML那麼通用性;

B.JSON格式目前在Web Service中推廣還屬於初級階段。

在Javascript中實現XML和JSON相互轉換

先看調用例子:

復制代碼 代碼如下:

<viewport id="menuPane" layout="border">
<panel region="center" border="0" layout="border">
<tbar>
<toolbar text="XXXX">
<menu>
<text text="11">
</text>
<text text="22">
</text>
<text text="33">
</text>
</menu>
</toolbar>
<toolbar text="XXXX">
<menu>
<text text="44">
</text>
<text text="55">
</text>
<menu>
<text text="6 6">
</text>
</menu>
<text text="77">
</text>
</menu>
</toolbar>
</tbar>
</panel>
</viewport>
var xmlParser = new XmlToJson();
var json = xmlParser.parse(xml);
console.log( JSON.stringify(json) );
var jsonParser = new JsonToXml();
var xml = jsonParser.parse(json);
console.log( xml );

XML轉換為JSON:

復制代碼 代碼如下:

function XmlToJson() {
}
XmlToJson.prototype.setXml = function(xml) {
if(xml && typeof xml == "string") {
this.xml = document.createElement("div");
this.xml.innerHTML = xml;
this.xml = this.xml.getElementsByTagName("*")[0];
}
else if(typeof xml == "object"){
this.xml = xml;
}
};
XmlToJson.prototype.getXml = function() {
return this.xml;
};
XmlToJson.prototype.parse = function(xml) {
this.setXml(xml);
return this.convert(this.xml);
};
XmlToJson.prototype.convert = function(xml) {
if (xml.nodeType != 1) {
return null;
}
var obj = {};
obj.xtype = xml.nodeName.toLowerCase();
var nodeValue = (xml.textContent || "").replace(/(\r|\n)/g, "").replace(/^\s+|\s+$/g, "");

if(nodeValue && xml.childNodes.length == 1) {
obj.text = nodeValue;
}
if (xml.attributes.length > 0) {
for (var j = 0; j < xml.attributes.length; j++) {
var attribute = xml.attributes.item(j);
obj[attribute.nodeName] = attribute.nodeValue;
}
}
if (xml.childNodes.length > 0) {
var items = [];
for(var i = 0; i < xml.childNodes.length; i++) {
var node = xml.childNodes.item(i);
var item = this.convert(node);
if(item) {
items.push(item);
}
}
if(items.length > 0) {
obj.items = items;
}
}
return obj;
};

JSON轉換為XML:

復制代碼 代碼如下:

function JsonToXml() {
this.result = [];
}
JsonToXml.prototype.spacialChars = ["&","<",">","\"","'"];
JsonToXml.prototype.validChars = ["&","<",">",""","'"];
JsonToXml.prototype.toString = function(){
return this.result.join("");
};
JsonToXml.prototype.replaceSpecialChar = function(s){
for(var i=0;i<this.spacialChars.length;i++){
s=s.replace(new RegExp(this.spacialChars[i],"g"),this.validChars[i]);
}
return s;
};
JsonToXml.prototype.appendText = function(s){
s = this.replaceSpecialChar(s);
this.result.push(s);
};
JsonToXml.prototype.appendAttr = function(key, value){
this.result.push(" "+ key +"=\""+ value +"\"");
};
JsonToXml.prototype.appendFlagBeginS = function(s){
this.result.push("<"+s);
};
JsonToXml.prototype.appendFlagBeginE = function(){
this.result.push(">");
};
JsonToXml.prototype.appendFlagEnd = function(s){
this.result.push("</"+s+">");
};
JsonToXml.prototype.parse = function(json){
this.convert(json);
return this.toString();
};
JsonToXml.prototype.convert = function(obj) {
var nodeName = obj.xtype || "item";
this.appendFlagBeginS(nodeName);
var arrayMap = {};
for(var key in obj) {
var item = obj[key];
if(key == "xtype") {
continue;
}
if(item.constructor == String) {
this.appendAttr(key, item);
}
if(item.constructor == Array) {
arrayMap[key] = item;
}
}
this.appendFlagBeginE();
for(var key in arrayMap) {
var items = arrayMap[key];
for(var i=0;i<items.length;i++) {
this.convert(items[i]);
}
}
this.appendFlagEnd(nodeName);
};

以上就是為大家整理的在Javascript中實現XML和JSON相互轉換,希望本文所述對大家學習javascript有所幫助。

熱點內容
clr與預編譯頭不一致 發布:2024-12-01 10:22:58 瀏覽:988
天翼4k零配置專用機頂盒怎麼用 發布:2024-12-01 10:19:24 瀏覽:910
pythondoublestring 發布:2024-12-01 10:07:17 瀏覽:770
天翼雲伺服器多ip地區有哪些 發布:2024-12-01 10:02:01 瀏覽:196
安卓手機26鍵如何加標點符號 發布:2024-12-01 09:43:41 瀏覽:317
什麼是android語言 發布:2024-12-01 09:36:00 瀏覽:911
騰訊雲伺服器的月流量 發布:2024-12-01 09:29:43 瀏覽:646
私服伺服器搭建與租用 發布:2024-12-01 09:28:05 瀏覽:572
我的世界如何給伺服器差評 發布:2024-12-01 09:28:04 瀏覽:106
免費緩存軟體哪個好用 發布:2024-12-01 09:26:34 瀏覽:428