2016-06-21 101 views
1

我需要寻找指定,但不使用命名空间XML解析XML:使用python/elementree

<WRMHEADER xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader" version="4.0.0.0"> 
    <DATA> 
     <PROTECTINFO> 
      <KEYLEN>16</KEYLEN> 
      <ALGID>AESCTR</ALGID> 
     </PROTECTINFO> 

     <LA_URL>http://192.168.8.33/license/rightsmanager.asmx</LA_URL> 
     <LUI_URL>http://192.168.8.33/license/rightsmanager.asmx</LUI_URL> 

     <DS_ID></DS_ID> 
     <KID></KID> 
     <CHECKSUM></CHECKSUM> 

    </DATA> 
</WRMHEADER> 

我想阅读的各个领域,例如值数据/ protectinfo/KEYLEN等

root = ET.fromstring(sMyXml) 
keylen = root.findall('./DATA/PROTECTINFO/KEYLEN') 

print root 
print keylen 

此代码打印如下:

<Element {http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader}WRMHEADER at 0x7f2a7c35be60> 
[] 

root.find和root.findall返回None或[]对于这个查询。我一直无法指定默认名称空间,是否有解决方案来查询这些值? 感谢

回答

1

创建一个命名空间字典:

x = """<WRMHEADER xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader" version="4.0.0.0"> 
    <DATA> 
     <PROTECTINFO> 
      <KEYLEN>16</KEYLEN> 
      <ALGID>AESCTR</ALGID> 
     </PROTECTINFO> 

     <LA_URL>http://192.168.8.33/license/rightsmanager.asmx</LA_URL> 
     <LUI_URL>http://192.168.8.33/license/rightsmanager.asmx</LUI_URL> 

     <DS_ID></DS_ID> 
     <KID></KID> 
     <CHECKSUM></CHECKSUM> 

    </DATA> 
</WRMHEADER>""" 
from xml.etree import ElementTree as ET 

root = ET.fromstring(x) 
ns = {"wrm":"http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader"} 
keylen = root.findall('wrm:DATA', ns) 

print root 
print keylen 

现在你应该得到的东西,如:

<Element '{http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader}WRMHEADER' at 0x7fd0a30d45d0> 
[<Element '{http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader}DATA' at 0x7fd0a30d4610>] 

要获得/DATA/PROTECTINFO/KEYLEN

In [17]: root = ET.fromstring(x) 

In [18]: ns = {"wrm":"http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader"} 
In [19]: root.find('wrm:DATA/wrm:PROTECTINFO/wrm:KEYLEN', ns).text 
Out[19]: '16' 
+1

不用担心,如果你是在Python做了很多工作,使用XML,你可能会发现有用LXML http://lxml.de/ –

1

我想知道,如果这能也工作。请发表您对这种方法的优缺点的评论。

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

# Open XML document using minidom parser 
DOMTree = xml.dom.minidom.parse("xmlquestion.xml") 
tn = DOMTree.documentElement 
print tn.namespaceURI 
#print tn.childNodes 

data = tn.getElementsByTagName('DATA')[0] 
protectinfo = data.getElementsByTagName('PROTECTINFO')[0] 
keylen = protectinfo.getElementsByTagName('KEYLEN')[0] 
print keylen.childNodes[0].data 

http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader 
16 
+0

这是伟大的。因为我的数据源来自网络请求,所以必须稍微修改才能导入parseString。我只是在寻找一种快速验证xml内容的方法。我想和ET一起去,因为它似乎被更广泛地使用,尽管我发现这个问题令人沮丧,因为文档似乎不足,并且它似乎是这样一个基本问题。 –