Если бы я делал это на 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, которую я только что дал вам.
(Моя цель - показать вам, как решить проблему, а не назвать названия нужных вам классов.)