1

我正在尝试分析转储中的维基百科文章。该文件zhwiki-latest-pages-articles.xml是一个巨大的 XML 文件。我决定使用XMLStreamReader读取文件并导入数据库。

问题是 XMLStreamReader 不能识别一些StartElement. 我需要它来提取元素文本。例如像这样的文件

<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.8/" xmlns:xsi="http://ww
w.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/x
ml/export-0.8/ http://www.mediawiki.org/xml/export-0.8.xsd" version="0.8" xml:la
ng="zh">
  <siteinfo>
    <sitename>Wikipedia</sitename>
    <base>http://zh.wikipedia.org/wiki/Wikipedia:%E9%A6%96%E9%A1%B5</base>
    <generator>MediaWiki 1.23wmf12</generator>
    <case>first-letter</case>
    <namespaces>
      <namespace key="-2" case="first-letter">Media</namespace>
      <namespace key="-1" case="first-letter">Special</namespace>
      <namespace key="0" case="first-letter" />
    </namespaces>
  </siteinfo>
  <page>
    <title>Wikipedia:Upload log</title>
    <ns>4</ns>
    <id>1</id>
    <revision>
      <id>15649431</id>
      <parentid>11154293</parentid>
      <timestamp>2011-02-05T03:58:02Z</timestamp>
      <contributor>
        <username>AT</username>
        <id>248442</id>
      </contributor>
      <minor />
      <comment>[[Wikipedia:Upload log]]已被解除保护: 已保護一段長時間</comment>
      <text xml:space="preserve">...(some long text)</text>
      <sha1>prk62t3ad743sf0ighsrje6vu30qx88</sha1>
      <model>wikitext</model>
      <format>text/x-wiki</format>
    </revision>
  </page>
</mediawiki>

元素 likesiteinfotitle不能出现在streamReader.next()asstreamReader.isStartElement()条件中。

这是我的代码

    XMLInputFactory inputFactory = XMLInputFactory.newInstance();
    InputStream in = new FileInputStream("zhwiki-latest-pages-articles.xml");
    XMLStreamReader streamReader = inputFactory.createXMLStreamReader(in);
    Set<String> namespaces = new HashSet<>();
    int articles = 0;

    String title = null;
    String context;
    Set<String> categories = new HashSet<>();

    while (true) {
        try {
            streamReader.next();
        } catch (Exception e) {
            break;
        }
        String localName = null;
        try {
            localName = streamReader.getLocalName();
        } catch (Exception e) {
        }
        if (streamReader.isStartElement()) {
            System.out.println(localName);
        }
    }
    System.out.println(articles + " articles");

这是输出

mediawiki
sitename
base
generator
case
namespaces
namespace
namespace
namespace
page
ns
id
revision
parentid
timestamp
contributor
id
minor
comment
text
sha1
model
format
4

0 回答 0