2013-04-01 86 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文件中排除该类型。