Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从大量xml文件中提取一些数据_Xml_Batch File_Extract_Dos - Fatal编程技术网

从大量xml文件中提取一些数据

从大量xml文件中提取一些数据,xml,batch-file,extract,dos,Xml,Batch File,Extract,Dos,我将板球运动员档案以.xml文件的形式保存在文件夹中。每个文件中都有以下标记: <playerid>547</playerid> <majorteam>England</majorteam> <playername>Don</playername> 547 英格兰 唐 playerid与.xml中的相同(每个文件大小不同,从1kb到5kb)。这些文件大约有500个。我需要的是从所有这些文件中提取playername

我将板球运动员档案以
.xml
文件的形式保存在文件夹中。每个文件中都有以下标记:

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


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

为什么不直接执行
cat*.xml>all.xml

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

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

c:\temp>xsd.exe player.xml

这将基于XML文件生成XML模式

接下来,从VisualStudio2008命令提示符运行

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          
}

如果我必须做这个任务,我可能会用Perl来做。前面关于连接(cat)所有文件的建议实际上并不正确,因为最终得到的不是一个有效的XML文件,而是一组背靠背的有效XML文件

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

如果XPath太麻烦,您可能还需要研究正则表达式,俗称正则表达式。Perl具有惊人的正则表达式支持


如果我必须使用Java,我可能会使用。如果我想真正了解文档的XML节点,我可能会使用。

选择脚本语言。我的是蟒蛇

在这种语言中,这是关于您正在寻找的内容:

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()
import xml.dom.minidom
导入glob
从xml.parsers.expat导入expat错误
base_doc=xml.dom.minidom.parseString(“”)
文档元素=基本文档元素
对于glob.glob(“*.xml”)中的文件名:
f=打开(文件名)
x=f.read()
f、 关闭()
尝试:
player=xml.dom.minidom.parseString(x)
除错误外:
打印“读取文件%s时出错”%filename
持续
打印“读取文件%s”%filename
doc_元素.childNodes.insert(-1,player.documentElement.cloneNode(True))
f=open(“all_my_players.xml”、“w”)
f、 写入(doc_element.toxml())
f、 关闭()

您想使用哪种编程语言?您需要学习将问题分解成几个部分。第1部分将迭代所有文件。第2部分读取一个xml文件。现在你想从我们这里得到什么?c#或windows批处理脚本,或基本的windows vb脚本。任何我可以用我自己开发的工具轻松执行的方法have@LieH2O:这将仅连接所有文件。您可以使用自己选择的语言来解析XML。我相信所有主要语言都会有图书馆。例如,在PHP中,只需调用一次
simplexml\u load\u file
即可获得包含所有值的数组。这无疑是最简单的方法。我只是连接了所有文件,现在要用c#xpath解析它。之后,我只是根据我的需要解析并打印该文件。如果你没有Python,就去获取它。ActiveState的发行版包罗万象,易于设置,并且可以免费下载。上面的脚本是针对Python 2。x,而不是Python 3.Xi建议STAX,而不是SAX。StAX是基于流的,允许您查找nextElement、nextAttribute等。SAX是事件驱动的,当遇到新节点时触发事件,等等。DOM是基于树的。斯塔克斯在中间的某个地方。您可以操纵光标并从文件中提取新信息。这非常有用,我使用这种方式将整个xml文件加载并保存到数据库中。