2011-06-28 108 views
0

我正在使用lxml來讀取我的xml文件。我正在使用類似下面的代碼。它適用於lxml2.3 beta1,但如果使用lxml2.3,則會出現zn xml語法錯誤,如下所示。我瀏覽了兩個版本的發行說明,但無法弄清楚可能導致此錯誤的原因或解決方法。如果你遇到過這樣的事情或者有任何線索,請幫助。lxml XMLSyntaxError:未找到命名空間的默認前綴

謝謝!

代碼:

from lxml import etree 
def parseXml(context,attribList,elemList):  
    for event, element in context: 
     if element.tag in elemList:   
     #read element attributes 
    element.clear() 

def main(object): 
    ns='{NS}' 
    attribList=['name','age','id'] 
    elemList=[ns+'Employee',ns+'Experience',ns+'Employment',ns+'Project',ns+'Award'] 
    context=etree.iterparse(fullFilePath, events=("start","end")) 
    parseXml(context,attribList,elemList) 

錯誤:

File "iterparse.pxi", line 478, in lxml.etree.iterparse.next (src/lxml/lxml.etree.c:95348) File "iterparse.pxi", line 530, in lxml.etree.iterparse._read_more_events (src/lxml/lxml.etree.c:95886) File "parser.pxi", line 585, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:71955) XMLSyntaxError: Namespace default prefix was not found, line 545, column 73

XML樣本 -

<root xmlns='NS'> 
<Employee Name="Mr.ZZ" Age="30"> 
    <Experience TotalYears="10" StartDate="2000-01-01" EndDate="2010-12-12"> 
    <Employment id = "1" EndTime="ABC" StartDate="2000-01-01" EndDate="2002-12-12"> 
    <Project Name="ABC_1" Team="4"> 
    </Project> 
    </Employment> 
    <Employment id = "2" EndTime="XYZ" StartDate="2003-01-01" EndDate="2010-12-12"> 
    <PromotionStatus>Manager</PromotionStatus> 
    <Project Name="XYZ_1" Team="7"> 
    <Award>Star Team Member</Award> 
    </Project> 
    </Employment> 
    </Experience> 
</Employee> 
</root> 

的 '僱員' 是根內重複。錯誤發生在解析器已經正確地通過許多員工之後。

編輯1: 於捕捉異常,我抓住以下幾點:

WARNING:NAMESPACE:NS_ERR_UNDEFINED_NAMESPACE: Namespace default prefix was not found 

回答

2

好了,我終於想通了事情的原委。在清理使用過的元素之後,我正在清理所有元素,包括根節點。根節點是具有默認名稱空間前綴的節點,適用於該根中的所有節點。由於我清除了我的根節點,默認的名稱空間前綴不再是其子元素的nsmap的一部分。以前的版本似乎是寬容的,但最新版本在這個意義上更嚴格。

不清除根元素,直到我讀完xml完成​​了我的詭計。

0

默認命名空間的問題,當你試圖XPath表達式經常出現。爲了像在你的示例中一樣解析數據流,2.3.0應該可以正常使用未命名的默認命名空間。

也許你應該張貼儘可能小的xml文件,讓這個錯誤(行545是相當深到該文件中有這樣的誤差)

+0

感謝您的回覆。我在原始文章中添加了xml示例,並編輯了代碼示例以顯示我如何使用名稱空間。我基本上比較元素標籤,以確保它是我所期望的。遇到未知標籤時,我會記錄一個錯誤。但是在這裏,lxml只是拋出錯誤。我檢查了#545行,看看有沒有什麼看起來錯了,但xml看起來很好(它應該可以正常工作,使用lxml 2.3 beta1)。 – Rinks

相關問題