Если бы я делал это в Java, я бы использовал javax.xml.stream.XMLEventReader и javax.xml.stream.XMLEventWriter.
В каком-то псевдокоде, давайте предположим <article>
тега разграничивает каждую статью Википедии, что вам не нужно беспокоиться о вложенных <article>
тегах, и у вас есть openNewWriter()
функцию, чтобы открыть новый XMLEventWriter
, который записывает в новый файл с подходящим названием для этой статьи.
Тогда мой код будет выглядеть как-то вроде этого:
XMLEventReader r = // an XMLEventReader for the original wikipedia dump
XMLEventWriter w = null;
bool isInsideArticle = false;
while (r.hasNext()){
XMLEvent e = r.nextEvent();
if (e.isStartElement() &&
e.asStartElement().getName().getLocalPart().equals("article")){
w = openNewWriter();
// write the stuff that belongs outside the <article> tag
// by synthesizing XMLEvents and using w.add() to add them
w.add(e);
isInsideArticle = true;
} else if (e.isEndElement() &&
e.asEndElement().getName().getLocalPart().equals("article")) {
w.add(e);
// write the stuff that belongs outside the <article> tag
// by synthesizing XMLEvents and using w.add() to add them
isInsideArticle = false;
w.close();
} else if (isInsideArticle) {
w.add(e);
} else {
// this tag gets dropped on the floor because it's not inside any article
}
}
Теперь все, что вам нужно сделать, это найти классы потокового XML в .NET. Я думаю, что они system.xml.XMLReader и system.xml.XMLWriter, но мой опыт не в .NET, и я не могу сказать из документации, будут ли они работать так же, как и Java-версия, которую я вам только что дал.
(Моя цель здесь, чтобы показать вам, как подойти к проблеме, чем рассказать вам имена нужных вам классов.)