2017-05-23 122 views
0

在Windows系統上,我有一個日誌文件,它由多個連接在一起的XML文件組成。將包含多個子文件的日誌文件拆分爲子文件

每個嵌入式XML文件的開頭爲: <?xml version="1.0" standalone="yes"?>

我想每一個人嵌入XML文件寫出到自己單獨的文件。

我一直在玩使用PowerShell,但不能完全把它一起

示例文件:

<?xml version="1.0" standalone="yes"?>                     
<INSTANCES>                            
    <INSTANCE>                           
    <HOST_NAME>sstest</HOST_NAME>                    
    <INSTANCE_NAME>SSTEST1</INSTANCE_NAME>                    
    <DATABASE_NAME>SSTEST</DATABASE_NAME>                    
    <OPEN_MODE>READ WRITE</OPEN_MODE>                     
    <DATABASE_ROLE>PRIMARY</DATABASE_ROLE>                    
    <CREATED>2016-01-18</CREATED>                      
    <DBID>192837465</DBID>                        
    </INSTANCE>                           
</INSTANCES>                           
<?xml version="1.0" standalone="yes"?>                     
<PARAMS>                            
    <PARAM>                            
    <NAME>enable_logging</NAME>                      
    <VALUE>FALSE</VALUE>                        
    </PARAM>                            
    <PARAM>                            
    <NAME>db_valid</NAME>                   
    <VALUE>YES</VALUE>                     
    </PARAM>                            
    <PARAM>                            
    <NAME>enable_auditing</NAME>                      
    <VALUE>FALSE</VALUE>                        
    </PARAM>                            
    <PARAM>                            
    <NAME>managament_access</NAME>                   
    <VALUE>TRUE</VALUE>                     
    </PARAM>                            
</PARAMS> 
+1

您最好包括您嘗試過的東西,因爲它似乎已經嘗試了某些東西。這給了我們一個想法,就是你想要完成的任務只是看到一個代碼寫入請求。我們可以向您展示您可能出錯的地方以及展示其他方法。 – Matt

回答

1

對我來說,以下工作:

$myXml = @' 
    <?xml version="1.0" standalone="yes"?>                     
    <INSTANCES>                            
     <INSTANCE>                           
     <HOST_NAME>sstest</HOST_NAME>                    
     <INSTANCE_NAME>SSTEST1</INSTANCE_NAME>                    
     <DATABASE_NAME>SSTEST</DATABASE_NAME>                    
     <OPEN_MODE>READ WRITE</OPEN_MODE>                                        
     <DBID>192837465</DBID>                        
     </INSTANCE>                           
    </INSTANCES>                           
    <?xml version="1.0" standalone="yes"?>                     
    <PARAMS>                            
     <PARAM>                            
     <NAME>enable_logging</NAME>                      
     <VALUE>FALSE</VALUE>                        
     </PARAM>                            
     <PARAM>                            
     <NAME>db_valid</NAME>                   
     <VALUE>YES</VALUE>                     
     </PARAM>                            
     <PARAM>                            
     <NAME>enable_auditing</NAME>                      
     <VALUE>FALSE</VALUE>                        
     </PARAM>                                                     
    </PARAMS> 
'@ 

    $separator = [string[]]@('<?xml version="1.0" standalone="yes"?>') 
    $myXml.Split($separator, [System.StringSplitOptions]::RemoveEmptyEntries) 
2

作爲一種替代方法Hackerman的回答是,你可以使用正則表達式,例如(?=exampleregex)

(Get-Content C:\examplepath.xml -raw) -split '(?=<\?xml\ version="1\.0"\ standalone="yes"\?>)' | 
    Where-Object {$_ -ne ""} | 
    ForEach-Object {$i=0} {$_ | Out-File "C:\exampleoutput$i.xml"; i++} 
+0

可以肯定的是,它將爲標題行輸出一個文件,然後爲每個XML塊輸出一個文件。試試這個正則表達式替代''(?s)(\ <\?xml version =「1.0」。*?)(?= \ <\?xml version =「1.0」) – TheMadTechnician

+0

@TheMadTechnician我相信這些在功能上是等效的除非你的正則表達式在每個元素之間會有一個空字符串,除了最後一次匹配。 (無論如何,這會被'$ _ -ne「」'過濾出來)如果使用了'-match',那麼這將會不同,因爲沒有任何東西被捕獲,所以你會更好。 – BenH

+0

你是對的,我完全誤會你的正則表達式,錯過了這是一個展望。 – TheMadTechnician

相關問題