2011-05-10 5 views
1

python에서 다음 xml에서 항목 목록을 추출하는 가장 좋은 방법은 무엇입니까?Python의 XML에서 항목 목록 추출

<iq xmlns="jabber:client" to="[email protected]/8978528613056092673206" 
from="conference.localhost" id="disco" type="result"> 
    <query xmlns="http://jabber.org/protocol/disco#items"> 
     <item jid="[email protected]" name="pgatt (1)"/> 
     <item jid="[email protected]" name="pgatt (1)"/> 
    </query> 
</iq> 

보통 xpath와 함께 lxml을 사용하지만이 경우에는 작동하지 않습니다. 내 문제는 네임 스페이스 때문인 것 같습니다. 나는 lxml에 설정되어 있지 않으며 어떤 라이브러리를 사용하도록 열려 있습니다.

xml의 일반적인 구조가 변경되면 실패 할 정도로 견고한 솔루션을 원합니다.

+0

어쩌면 당신은 당신이 원하는 정보는 무엇인가 http://stackoverflow.com/questions/1953761/accessing-xmlns-attribute-with-python-elementree – Donovan

+0

봐야한다 추출물? – MattH

답변

1

lxml에 대해서는 확실하지 않지만 과 같은 표현식을 사용하면 네임 스페이스에 관계없이 item 요소를 추출 할 수 있습니다.

XML 처리를 위해 Amara을 살펴볼 수도 있습니다.

>>> import amara.bindery 
>>> doc = amara.bindery.parse(
...  '''<iq xmlns="jabber:client" 
...   to="[email protected]/8978528613056092673206" 
...   from="conference.localhost" id="disco" type="result"> 
...   <query xmlns="http://jabber.org/protocol/disco#items"> 
...   <item jid="[email protected]" name="pgatt (1)"/> 
...   <item jid="[email protected]" name="pgatt (1)"/> 
...   </query> 
...  </iq>''') 
>>> for item in doc.iq.query.item: 
... print item.jid, item.name 
... 
[email protected] pgatt (1) 
[email protected] pgatt (1) 
>>> 

아마라를 발견하고 나면 결코 XML 처리를 고려하지 않을 것입니다.

+0

감사합니다. '// * [local-name() = "item"]'내가 필요한 것입니다. – Gattster

+0

흥미 롭다.이 도서관의 속도에 대해 불평 할만한 이유가 있었습니까? – MattH

+0

@MattH -별로. 그것은 엄청나게 빠르지는 않지만 지금까지 어떤 불만도 없었습니다. 사용 편의성을 고려하여 다른 lib 디렉토리로 돌아 가기 전에 캐시를 이용하는 방법을 찾을 것입니다. –

1

xml 데이터를 구문 분석하고 검색하는 방법에 대해 이전에 비슷한 질문에 답했습니다.

Full text searching XML data with Python: best practices, pros & cons

당신은 xml2json 기능을보고 싶을 것이다. 함수는 minidom 객체를 필요로합니다. 이것은 내가 어떻게 내 XML을 가지고 있는지, 당신이 그것을 어떻게하는지 확신하지 못한다.

from xml.dom import minidom 
x = minidom.parse(urllib.urlopen(url)) 
json = xml2json(x) 

또는 문자열이 아닌 URL을 사용하는 경우 :

x = minidom.parseString(xml_string) 
json = xml2json(x) 

xml2json 기능은 다음 XML에있는 모든 값을 사전을 반환합니다. 레이아웃을 어떻게 보이는지 알아 보려면 출력을 인쇄해야 할 수도 있습니다.

0

나는 보트를 놓쳤다. 그러나 여기 네임 스페이스를 돌보는 동안 그것을하는 방법이있다.

쿼리에서 모두 철자를 입력하거나 xpath 쿼리에 전달하는 네임 스페이스 맵을 만들 수 있습니다.

from lxml import etree 

data = """<iq xmlns="jabber:client" to="[email protected]/8978528613056092673206" 
from="conference.localhost" id="disco" type="result"> 
    <query xmlns="http://jabber.org/protocol/disco#items"> 
     <item jid="[email protected]" name="pgatt (1)"/> 
     <item jid="[email protected]" name="pgatt (1)"/> 
    </query> 
</iq>""" 

nsmap = { 
    'jc': "jabber:client", 
    'di':"http://jabber.org/protocol/disco#items" 
} 

doc = etree.XML(data) 

for item in doc.xpath('//jc:iq/di:query/di:item',namespaces=nsmap): 
    print etree.tostring(item).strip() 
    print "Name: %s\nJabberID: %s\n" % (item.attrib.get('name'),item.attrib.get('jid')) 

는 생산 :

<item xmlns="http://jabber.org/protocol/disco#items" jid="[email protected]" name="pgatt (1)"/> 
Name: pgatt (1) 
JabberID: [email protected] 

<item xmlns="http://jabber.org/protocol/disco#items" jid="[email protected]" name="pgatt (1)"/> 
Name: pgatt (1) 
JabberID: [email protected]