2017-07-08 125 views
1

我正在尋找可以將具有多個標籤的大型XML拆分爲多個XML文件的批處理/ VBScript。請參閱下面的細節。將XML拆分爲多個XML


輸入XML:

<Shipment> 
----some data- say 001------- 
</Shipment> 
< Shipment> 
---- Some data- say 002------- 
</Shipment> 

****輸出XML 1:****

<Shipment> 
---some data- say 001------- 
</Shipment> 

輸出XML 2:

<Shipment> 
----some data- say 002------- 
</Shipment> 

我的代碼下面是不工作的原因。任何人都可以用邏輯幫助我嗎? 我一直在嘗試獲取只有單個<shipment>標記的輸入數據。

代碼:

::Read Xml file 
    set f_xml=input2.xml  
    for %%i in (%f_xml%) do (
     set xmlfilename=%%~ni 
    ) 

    ::Write XML file 
    for /f "tokens=1* delims=]" %%b in ('type "!xmlfilename!" ^| find /n /v ""') do (
     if /i *%%c*==*[Shipment]* set inblock=1 
     if !inblock!==1 (
      if *%%c*==** (echo.) else (echo %%c) 
      if /i *%%c*==*[/Shipment]* set inblock=0 
     ) 
    ) 
    echo. 
) >> output.xml 
+2

您正在尋找專人爲您編寫此代碼。當你問Stack Overflow時,你需要展示你解決問題的努力。 – SteveFest

+0

感謝您的免費建議,對於腳本編程不熟悉,因此要求提供邏輯代碼而不是代碼完全代碼 – prashanth

+0

由於您有無與倫比的右括號,因此您的代碼無法正常工作。另外,「大」究竟有多大? –

回答

1

這是更好地分析和客觀化XML和其他此類結構化標記,而不是黑客和刮它是純文本。遺憾的是,cmd解釋器本身不提供太多解析XML的功能,但很容易從其他的腳本引擎借用。

PowerShell特別適合處理XML。您可以將XML文件作爲文本讀取,然後通過使用[xml]加速器對其進行預處理,將該數據作爲XML對象進行轉換。方便,對嗎?從那裏,使用XPath表達式選擇所有Shipment節點;然後爲每個克隆到一個新的XML對象並保存。

這是一個混合Batch + PowerShell腳本,演示了這一點。用.bat擴展名和鹽來保存。

<# : Batch portion 
@echo off & setlocal 

set "xmlfile=test.xml" 

powershell -noprofile "iex (${%~f0} | out-string)" 
goto :EOF 

: end Batch/begin PowerShell hybrid code #> 

[xml]$xml = "<root>$(gc $env:xmlfile)</root>" 

$xml.SelectNodes("//Shipment") | %{ 
    $x = new-object xml 
    $x.AppendChild($x.ImportNode($_, $true)) 
    $x.Save("shipment{0:D3}.xml" -f ++$i) 
} 

的缺點這種方法是你的大XML文件必須加載到內存中,即使第一塊被保存之前。根據「大」的大小,您可能不得不求助於流讀取器和平面文本刮取來加速執行(類似於您最初的預期,但使用比批次for /f更高效的閱讀器)。如果可能,應儘量避免平面文本刮擦(請參閱this ugly example)。但是,如果您正在使用可在演出中測量的XML文件,則可能沒有其他選擇。

0

A到寫兄弟節點到單個文件使用VBScript非常基本的方法是讀取輸入文件作爲XML和各個節點的XML文本導出爲明文:

Set xml = CreateObject("Msxml2.DOMDocument.6.0") 
xml.Async = False 
xml.Load "C:\path\to\input.xml" 

If xml.ParseError <> 0 Then 
    WScript.Echo xml.ParseError.Reason 
    WScript.Quit 1 
End If 

i = 1 
Set fso = CreateObject("Scripting.FileSystemObject") 
For Each n In xml.SelectNodes("//Shipment") 
    outfile = fso.BuildPath("C:\path\to", "output" & i & ".xml") 
    Set f = fso.CreateTextFile(outfile) 
    f.Write n.Xml 
    f.Close 
    i = i + 1 
Next 

注意,此代碼沒有按」將XML聲明添加到輸出文件中。如果你想要,你需要自己添加它。

還要注意,上面的代碼假定輸入文件是有效的XML(即兄弟節點具有公共單根節點)。