2013-04-05 96 views
1

我收到一個名爲xml的參數,其中包含一個xml文檔。這就是我試圖...Django XML無法加載外部實體

from lxml.cssselect import CSSSelector, etree 
from lxml.etree import fromstring 

if request.POST: 

    parser = etree.XMLParser(ns_clean=True, recover=True) 
    h = etree.parse(request.POST['xml'], parser) 

    return HttpResponse(h) 

,但我得到這個錯誤:

[Fri Apr 05 09:50:13 2013] [error] IOError: Error reading file '<?xml version="1.0" encoding="ISO-8859-1"?> 
[Fri Apr 05 09:50:13 2013] [error] <delivery_receipt> 
[Fri Apr 05 09:50:13 2013] [error]  <version>1.1</version> 
[Fri Apr 05 09:50:13 2013] [error]  <msisdn>447777111111</msisdn> 
[Fri Apr 05 09:50:13 2013] [error]  <submission_ref>123456789</submission_ref> 
[Fri Apr 05 09:50:13 2013] [error]  <status>Delivered</status> 
[Fri Apr 05 09:50:13 2013] [error]  <reason>4</reason> 
[Fri Apr 05 09:50:13 2013] [error]  <gmt_timestamp>20130405095100</gmt_timestamp> 
[Fri Apr 05 09:50:13 2013] [error]  <retry>0</retry> 
[Fri Apr 05 09:50:13 2013] [error] </delivery_receipt>': failed to load external entity "<?xml version="1.0" encoding="ISO-8859-1"?> 
[Fri Apr 05 09:50:13 2013] [error] <delivery_receipt> 
[Fri Apr 05 09:50:13 2013] [error]  <version>1.1</version> 
[Fri Apr 05 09:50:13 2013] [error]  <msisdn>447777111111</msisdn> 
[Fri Apr 05 09:50:13 2013] [error]  <submission_ref>123456789</submission_ref> 

什麼想法?謝謝:)

回答

1

request.POST默認返回unicode字符串。您遇到的下一個問題與您供應的編碼與您提供的文檔中聲明的編碼不匹配有關。

doc = request.POST.get('xml','') 
if not doc: 
    raise Exception() 
h = etree.XML(doc.encode('ascii'), parser) 
+0

你好,這給出了編碼聲明Unicode字符串,不支持:(您的答覆 – Prometheus 2013-04-05 09:18:38

1

etree.parse需要文件名(或文件對象)。沒有名爲<all your xml>的文件。

您需要的XML提要解析器:

from lxml.cssselect import CSSSelector, etree 
from lxml.etree import fromstring 

if request.POST: 

    parser = etree.XMLParser(ns_clean=True, recover=True) 
    parser.feed(request.POST['xml']) 
    h = parser.close() 
    ... 

或者使用fromstringXML功能。

h = fromstring(request.POST['xml'], parser=parser) 

h = etree.XML(request.POST['xml'], parser=parser) 

The lxml.etree tutorial

+0

嗨,@Pavel Anossov謝謝,我試過,但得到了「的Unicode字符串與編碼聲明不支持「與fromstring函數 – Prometheus 2013-04-05 09:16:07

+2

'etree.parse'也將採取URL – MattH 2013-04-05 09:18:19

+0

嗨@馬特H是的,它似乎給出了同樣的錯誤:編碼聲明的Unicode字符串不支持orted。但正如你所說的似乎這樣做。 – Prometheus 2013-04-05 09:19:49