Чтение тегов XML-файла - PullRequest
       14

Чтение тегов XML-файла

1 голос
/ 19 октября 2011

Я хочу прочитать значения тегов, такие как <title>, <title_id> из XML-файла. Значение <title> прочитано успешно. Можно ли прочитать <title>, <title_id> с тем же циклом?
Пожалуйста, помогите мне, я новичок в 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>

Я использую следующий код для чтения всего заголовка из файла. И работает нормально.

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

1 Ответ

1 голос
/ 19 октября 2011

Если вы собираетесь много работать с XML, я предлагаю вам ознакомиться с 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...