Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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

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_Xml_Batch File_Vbscript - Fatal编程技术网

将XML拆分为多个XML

将XML拆分为多个XML,xml,batch-file,vbscript,Xml,Batch File,Vbscript,我正在寻找一个batch/VBScript,它可以将带有多个标记的大型XML拆分为多个XML文件。详情请参阅下文 输入XML: --一些数据-比如001---- --一些数据-比如002---- ****输出XML 1:**** --一些数据-比如001---- 输出XML 2: --一些数据-比如002---- 由于某些原因,我下面的代码不起作用。谁能帮我学逻辑吗? 我试图用只有一个标签的输入来获取数据 代码: ::读取Xml文件 设置f_xml=input2.xml 对于%f_xml%do

我正在寻找一个batch/VBScript,它可以将带有多个标记的大型XML拆分为多个XML文件。详情请参阅下文

输入XML:

--一些数据-比如001---- <装运> --一些数据-比如002---- ****输出XML 1:****

--一些数据-比如001---- 输出XML 2:

--一些数据-比如002---- 由于某些原因,我下面的代码不起作用。谁能帮我学逻辑吗? 我试图用只有一个标签的输入来获取数据

代码:

::读取Xml文件 设置f_xml=input2.xml 对于%f_xml%do中的%%i 设置xmlfilename=%%~ni ::写入XML文件 对于/f标记=1*delims=]%%b in'类型!xmlfilename!^|查找/n/v'do 如果/i*%%c*==*[发货]*设置入块=1 如果进锁==1. 如果*%%c*==**回波。else echo%%c 如果/i*%%c*=*[/Shipping]*设置入块=0 回响 >>output.xml
解析和对象化XML和其他类似的结构化标记要比将其作为平面文本进行修改和删减要好。不幸的是,cmd解释器并没有提供太多本地解析XML的功能,但它很容易从其他脚本引擎中借用

PowerShell特别适合处理XML。您可以将XML文件读取为文本,然后通过使用[XML]加速器将该数据置于XML对象之前,将其转换为XML对象。汉迪,对吗?从那里,使用XPath表达式选择所有装运节点;然后,将每个对象克隆到一个新的XML对象并保存

下面是一个混合批处理+PowerShell脚本来演示这一点。使用.bat扩展名保存此文件,并根据口味添加盐

<:批量部分 @echo off和setlocal 设置xmlfile=test.xml powershell-noprofile iex${%~f0}|输出字符串 后藤:EOF :结束批处理/开始PowerShell混合代码> [xml]$xml=$gc$env:xmlfile $xml.SelectNodes//shipping |%{ $x=新对象xml $x.AppendChild$x.ImportNode$\uName,$true $x.saveshipping{0:D3}.xml-f++$i }
这种方法的缺点是,在保存第一个块之前,必须将大型XML文件加载到内存中。根据大小的不同,您可能需要使用流读取器和平面文本刮取来加快执行速度,这与您最初打算的类似,但使用的读取器比批处理for/f更高效。如果可能的话,应该避免刮平文本。但是,如果您使用的XML文件可以以GIG为单位进行度量,那么您可能别无选择。

使用VBScript将同级节点写入单个文件的一种非常基本的方法是将输入文件读取为XML,并将单个节点的XML文本导出为纯文本:

设置xml=CreateObjectMsxml2.DOMDocument.6.0 xml.Async=False xml.Load C:\path\to\input.xml 如果xml.ParseError为0,则 WScript.Echo xml.ParseError.Reason WScript.Quit 1 如果结束 i=1 设置fso=CreateObjectScripting.FileSystemObject 对于xml.SelectNodes//shipping中的每个n outfile=fso.BuildPathC:\path\to,output&i&.xml 设置f=fso.CreateTextFileoutfile f、 编写n.Xml f、 接近 i=i+1 下一个 请注意,此代码没有向输出文件添加XML声明。如果您想要,您需要自己添加它


还请注意,上面的代码假定输入文件是有效的XML,即同级节点具有公共的单根节点。

您正在寻找一个人为您编写此代码。当你询问堆栈溢出问题时,你需要展示你在解决这个问题上的努力。感谢你的免费建议,我对脚本编写是新手,因此询问的是有问题的逻辑而不是完整的代码。你的代码无法工作,因为你有一个不匹配的右括号。还有,大到底有多大?