Извлечь некоторые данные из большого количества XML-файлов - PullRequest
1 голос
/ 20 мая 2010

У меня есть профили игроков в крикет в виде <playerid>.xml файлов в папке. Каждый файл имеет следующие теги:

 <playerid>547</playerid>
 <majorteam>England</majorteam>
 <playername>Don</playername>

Playerid такой же, как в <playerid>.xml (каждый файл имеет разный размер, от 1 до 5 КБ) Это около 500 файлов. Что мне нужно, так это извлечь из списка все имена игроков, majorteam и playerid из всех этих файлов. Я преобразую этот список в XML позже. Если вы знаете, как я могу сделать это напрямую с XML, я буду очень благодарен.

Если есть способ сделать это с помощью C # или пакетных файлов Windows или VBScript, я также могу использовать Java. Мне просто нужно получить свои данные (идентификатор и имя) в одном месте.

Ответы [ 4 ]

2 голосов
/ 20 мая 2010

Почему бы тебе просто не сделать cat *.xml > all.xml?

1 голос
/ 20 мая 2010

Используйте xsd.exe для создания схемы и класса из вашего XML-файла.

Откройте командную строку Visual Studio 2008.
Из командной строки Visual Studio 2008 запустите

c: \ temp> xsd.exe player.xml

Это создает схему XML на основе вашего файла XML.

Далее из командной строки Visual Studio 2008 выполните

c: \ temp> xsd.exe player.xsd / classes / language: CS

Это создает новый класс на основе вашей схемы.

Теперь напишите код для десериализации XML-файла, используя сгенерированный вами класс; Вы можете поместить этот код в цикл для более чем файла.

FileStream fs = new FileStream("Player.XML", FileMode.Open);
// Create an XmlSerializer object to perform the deserialization
XmlSerializer xs = new XmlSerializer(typeof(Player));

Player p = xs.Deserialize(fs) as Player;
if ( s != null )
{
    // process player here          
}
0 голосов
/ 20 мая 2010

Выберите язык сценариев по вашему выбору. Мой Питон.

На этом языке это то, что вы ищете:

import xml.dom.minidom
import glob
from xml.parsers.expat import ExpatError

base_doc = xml.dom.minidom.parseString('<players/>')
doc_element = base_doc.documentElement

for filename in glob.glob("*.xml"):
    f = open( filename )
    x = f.read()
    f.close()
    try:
        player = xml.dom.minidom.parseString(x)
    except ExpatError:
        print "ERROR READING FILE %s" % filename
        continue
    print "Read file %s" % filename
    doc_element.childNodes.insert(-1, player.documentElement.cloneNode(True))

f = open( "all_my_players.xml", "w" )
f.write(doc_element.toxml())
f.close()
0 голосов
/ 20 мая 2010

Если бы мне пришлось выполнить эту задачу, я бы, вероятно, сделал это на Perl. Предыдущее предложение объединить (cat) все файлы не совсем корректно, так как в итоге вы получите не правильный XML-файл, а кучу действительных XML-файлов вплотную.

Perl имеет библиотеку CPAN, которая содержит все виды вещей для выполнения задач. Если вы установите XPath Library , то будет довольно легко найти нужные вам узлы и вывести их в список.

Если XPath слишком обременителен, вы также можете захотеть взглянуть на регулярные выражения, обычно известные как регулярные выражения. В Perl потрясающая поддержка регулярных выражений.

Если бы у меня было для использования Java, я бы, вероятно, использовал его поддержку регулярных выражений . Если бы я хотел по-настоящему разобраться с узлами XML документов, я бы, вероятно, использовал Sun Streaming API для XML (StAX) .

...