从许多xml文件中提取一些数据

时间:2010-05-19 22:29:19

标签: xml batch-file extract dos

我将cricket播放器配置文件以<playerid>.xml文件的形式保存在文件夹中。每个文件都包含这些标记:

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

playerid与<playerid>.xml中的相同(每个文件大小不同,1kb到5kb)。这些是大约500个文件。我需要的是从所有这些文件中提取playername,majorteam和playerid到列表。我稍后会将该列表转换为XML。如果您知道如何直接使用XML,我将非常感激。

如果有办法用C#或windows批处理文件或vbscript,我也可以使用Java。我只需要在一个地方获取我的数据(id和名称)。

4 个答案:

答案 0 :(得分:2)

你为什么不这样做cat *.xml > all.xml

答案 1 :(得分:1)

使用xsd.exe从XML文件生成架构和类。

打开Visual Studio 2008命令提示符 从Visual Studio 2008命令提示符,运行

  

C:\ TEMP&GT; xsd.exe player.xml

这将根据您的XML文件生成XML Schema。

接下来,从Visual Studio 2008命令提示符运行

  

C:\ TEMP&GT; 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          
}

答案 2 :(得分:0)

如果我必须执行此任务,我可能会在Perl中执行此操作。以前关于连接(cat)所有文件的建议并不正确,因为你最终会得到的不是有效的XML文件,而是一堆有效的XML文件背靠背。

Perl有一个名为CPAN的库,它包含完成任务的各种事情。如果您安装XPath Library,搜索所需的节点并将其输出到列表中应该非常容易。

如果XPath过于繁琐,您可能还需要查看正则表达式,俗称正则表达式。 Perl具有惊人的正则表达式支持。

如果我 使用Java,我可能会使用its support for regular expressions。如果我想真正了解文档的XML节点,我可能会使用Sun's Streaming API for XML (StAX)

答案 3 :(得分:0)

选择您喜欢的脚本语言。我的Python。

用这种语言来说,这就是你要找的东西:

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()