2013-04-05 92 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