2011-10-19 4 views
1

xml 파일에서 <title>, <title_id>과 같은 태그 값을 읽고 싶습니다. <title>의 값을 성공적으로 읽었습니다. 동일한 루프로 <title>, <title_id>을 읽을 수 있습니까?
XML 초보자입니다.XML 파일 태그 읽기

 <mediawiki xmlns="http://www.mediawiki.org/xml/export-0.5/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.5/ http://www.mediawiki.org/xml/export-0.5.xsd" version="0.5" xml:lang="en"> 
     <siteinfo> 
     <sitename>Wiki</sitename> 
     <case>first-letter</case> 
     <namespaces> 
      <namespace key="0" case="first-letter" /> 
     </namespaces> 
     </siteinfo> 
     <page> 
     <title>Sex</title> 
     <title_id>31239628</title_id> 
     <revision> 
      <id>437708703</id> 
      <timestamp>2011-07-04T13:53:52Z</timestamp> 
      <text xml:space="preserve" bytes="6830">{{ Hello}} 

    </text> 
     </revision> 
     </page> 
    </mediawiki> 

파일에서 모든 제목을 읽으려면 다음 코드를 사용합니다. 그리고 잘 작동합니다. 당신이 XML을 많이 작동하려는 경우

import xml.etree.cElementTree as etree 
tree = etree.parse('find_title.xml') 
for value in tree.getiterator(tag='title'): 
    print value.text 

답변

1

, 나는 당신이 XPATH을 숙지 건의 할 것입니다.

내 XML 라이브러리 선호도 인 lxml을 사용하는 빠른 스 니펫입니다.

from lxml import etree 

doc = etree.XML(""" 
<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.5/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.5/ http://www.mediawiki.org/xml/export-0.5.xsd" version="0.5" xml:lang="en"> 
    <siteinfo> 
    <sitename>Wiki</sitename> 
    <case>first-letter</case> 
    <namespaces> 
     <namespace key="0" case="first-letter" /> 
    </namespaces> 
    </siteinfo> 
    <page> 
    <title>Sex</title> 
    <title_id>31239628</title_id> 
    <revision> 
     <id>437708703</id> 
     <timestamp>2011-07-04T13:53:52Z</timestamp> 
     <text xml:space="preserve" bytes="6830">{{ Hello}} 
     </text> 
    </revision> 
    </page> 
</mediawiki> 
""") 

def first(seq,default=None): 
    for item in seq: 
    return item 
    return default 

NSMAP=dict(mw="http://www.mediawiki.org/xml/export-0.5/") 

print first(doc.xpath('/mw:mediawiki/mw:page/mw:title/text()',namespaces=NSMAP)) 
print first(doc.xpath('/mw:mediawiki/mw:page/mw:title_id/text()',namespaces=NSMAP)) 

수익률 :

 
Sex 
31239628 

업데이트-

XPATH 쿼리는 대부분 노드 시퀀스를 반환 여러 페이지 요소 (따라서 first 기능).

모든 페이지에 대해 두 태그의 값을 반환하는 단일 쿼리를 사용할 수 있습니다. 하위 요소가 페이지에서 누락 되었다면 단계별로 분류해야합니다. 당신은 하위 요소의 존재를 확인하기 위해 쿼리를 작성할 수 있지만, 그래서이 내 첫 번째 대답은 그래서 같은 페이지를 통해 루프 될 부분 기록, 등, 등

있다는 것을 알고 할 수 있습니다 :

for i,page in enumerate(doc.xpath('/mw:mediawiki/mw:page',namespaces=NSMAP)): 
    title = first(page.xpath('./mw:title/text()',namespaces=NSMAP)) 
    title_id = first(page.xpath('./mw:title_id/text()',namespaces=NSMAP)) 
    print "Page %s: %s (%s)" % (i,title,title_id) 

항복 :

Page 0: Sex (31239628)
+0

예, 이것은 약간의 과잉이다. 그러나 여러 네임 스페이스와 겹치는 태그 이름이있는 문서를 가져올 때 네임 스페이스를 사용하여 작업하는 방법을 알고 있으면 좋습니다. – MattH

+0

제안 해 주셔서 감사합니다. 하나의 결과 만 표시합니다. 여러개의 '' –