2013-04-01 125 views
0

我的XML看起來類似於以下嵌套的foreach語句解析XML

<Settings> 
    <CentralOnly> 
     <DateLists> 
      <DateList Name="name1" ID="1"> 
       <Date>*-01-01</Date> 
       <Date>*-12-25</Date> 
       <Date>2007-05-28</Date> 
       <Date>2007-09-03</Date> 
      </DateList> 
      <DateList Name="name2" ID="2"> 
       <Date>2008-11-11</Date> 
       <Date>2008-11-27</Date> 
      </DateList> 
      <DateList Name="name3" ID="3"> 
       <Date>2008-03-21</Date> 
       <Date>2010-04-02</Date> 
      </DateList> 
     </DateLists> 
    </CentralOnly> 
</Settings> 

的最終目標是把這個到SQL Server 2008 R2數據庫。我現在做這個(不好)的模式與每一列被寫入到一個單獨的文本文件

dateID.txt | specificDate.txt 
    1  |  *-01-01 
    1  |  *-12-25 
    1  |  2007-05-28 
    1  |  2007-09-03 
    2  |  2008-11-11 
    2  |  2008-11-27 
    3  |  2008-03-21 
    2  |  2010-04-02 

下面我相信這是正確的軌道做在時裝上的代碼(它尚未工作)。但是一定有辦法,我可以用一個文件做這個,也許是一個csv?

set-executionpolicy unrestricted 
[xml]$config = Get-Content c:\path\config.xml 
new-item c:\path\dlDays.txt -type file -force 
new-item c:\path\dlDLID.txt -type file -force 
$xml = $config.settings.DateLists.DateList | % $_.DateList{ 
    $dateID = $_.id 
    $eachDate = $_.date | % $_.date{ 
     $specificDate = $_.date 
     add-content c:\path\dlDays.txt $specificDate 
     add-content c:\path\dlDLID.txt $dateID 
    } 
} 
+0

爲了理解這個問題,你試圖從xml文件中提取日期id和特定日期,然後導入到SQL Server中? – Wade73

+0

這是正確的。我的任務是以某種方式將XML中的數據轉換爲sql。我對PowerShell有點熟悉,所以似乎是最好的方法 – mhopkins321

+0

嗯,我用powershell從響應xml文件中獲取錯誤。這比使用VB.Net或C#更容易。我不能說Ruby或Python。讓我看看我能做些什麼。 – Wade73

回答

3

#12: Output Objects

我打了你的XML文件,而不是輸出到兩個文件我做對象的數組。然後我只是將這些對象傳送給Export-Csv。

[xml]$config = Get-Content date.xml 
$newdlist = @() 
foreach($dlist in $config.Settings.CentralOnly.DateLists.DateList){ 
    $dateID = $dlist.ID 
    foreach($date in $dlist.Date){ 
     $newdlist += @(New-Object -TypeName psobject -Property @{'ID'=$dateID;'Date'=$date}) 
    } 
} 
$newdlist | Export-Csv -Path dat.csv 

現在,如果您想要再次使用$ newdlist,只需使用Import-Csv導入Csv文件即可。

PS C:\> $data = Import-Csv date.csv 
PS C:\> $data 

ID               Date 
--               ---- 
1               *-01-01 
1               *-12-25 
1               2007-05-28 
1               2007-09-03 
2               2008-11-11 
2               2008-11-27 
3               2008-03-21 
3               2010-04-02 

我不知道如何在PowerShell中使用SQL,但現在更容易使用數據。

$data | % {"INSERT '$($_.Date)' INTO 'Id' Where 'Id'='$($_.ID)'"} 

更多

CSV文件看起來是這樣的:

#TYPE System.Management.Automation.PSCustomObject 
"ID","Date" 
"1","*-01-01" 
"1","*-12-25" 
"1","2007-05-28" 
"1","2007-09-03" 
"2","2008-11-11" 
"2","2008-11-27" 
"3","2008-03-21" 
"3","2010-04-02" 
+0

我會給這個鏡頭。我不太關心sql部分。我可以在sql中使用csv imports。這是一個獲取數據的形式sql的問題,我會遇到問題 – mhopkins321

+0

您需要使用-noTypeInformation從csv文件中排除該類型 – Wade73

1

這是我用來生成一個CSV文件:

[xml]$xml = Get-Content -path "c:\temp\datedata.xml" 

$nodes = $xml.Settings.CentralOnly.DateLists.DateList 

$array = @() 

foreach ($node in $nodes) { 

    $id = $node.ID 

    foreach ($date in $node.Date) { 

     $entry = New-Object PSObject -property @{ 
      ID = $id 
      Date = $date 
     } 

     $array += $entry 
    } 

} 

$array | Export-Csv -Path 'c:\Temp\data.csv' -Delimiter ',' -noTypeInformation 

注:你需要使用-noT ypeInformation從csv文件中排除該類型。