Durchlaufen von xml-Elementen mit powershell
Ich habe einige xml-Dateien mit verschiedenen Elementen. Ich würde gerne code schreiben, entweder in c# oder powershell, durchläuft jedes element und ruft den Wert.
Ich möchte, dass es generisch genug, so dass ich verwenden können, es mit anderen xml-Dateien. Alle xml-Dateien haben das gleiche format, aber die Namen der Elemente zu verschieben.
Vielen Dank für Eure Hilfe.
<root>
<list>
<FirstName>Abc</FirstName>
<LastName>LT</LastName>
<Occupatoin>Eng</Occupation>
<BirthDate></BirthDate>
...
</list>
</root>
----------------------
XML file 2
<root>
<Trainings>
<Java>Ab</Java>
<NET>b</NET>
<SQL>c</SQL>
<Powershell>d</Powershell>
...
</Trainings>
</root>
Anderen xml eingeführt wurde, wird die Basis für die iteration der Elemente in der oben genannten xml-Dateien.
Holen Sie sich die Werte der genannten Elemente auf der Basis der Attribute der einzelnen Elemente unten:
<root>
<Element Name="Firstname />
<Element Name="Lastname" />
<Element Name="Occupation" />
<Element Name="Java" />
<Element Name="Net" />
...
</root>
[System.Xml.XmlDocument] $xdLists = new-object System.Xml.XmlDocument
[System.Xml.XmlDocument] $xdMig = new-object System.Xml.XmlDocument
$listfile = "C:\PowershellFiles\XmlLists.xml"
$xdLists.load($listfile)
$xdNodes= $xdLists.selectnodes("//DestinationLists/DestinationList")
$migCols = $xdLists.selectnodes("//MigrationColumns/Columns/Column")
#LOOP 1-----------------------------------------
foreach($xnode in $xdNodes)
{
Write-Host $xnode.Attributes.GetNamedItem("MigrationFile").Value
$destLists = $xnode.Attributes.GetNamedItem("Name").Value
$migfiles = $xnode.Attributes.GetNamedItem("MigrationFile").Value
Write-Host $destLists
#Check if the xml file to read from exists
if($migFiles -ne $null)
{
$xdMig.Load($migfiles)
$spSite = Get-SPSite "http://sp2010:100"
$spWeb = $spSite.OpenWeb()
$list = $spWeb.Lists[$destLists]
foreach($nCol in $migCols)
{
$destListCol = $nCol.Attributes.GetNamedItem("DestList").Value
$sourcCol = $nCol.Attributes.GetNamedItem("SourceCol").Value
# Write-Host $col " - " $list.Title
if($destListCol -eq $list.Title)
{
Write-Host $destListCol " - " $list.Title " - Source Column: " $sourcCol -ForegroundColor Green
Write-Host
# ----------------------- time to search the exported lists --------------------
Write-Host "Search the exported list for the right column" -ForegroundColor DarkYellow
if($xdMig.DocumentElement -ne $null)
{
$xnList = $xdMig.DocumentElement.ChildNodes
# LOOP 2----------------------------------------
Write-Host $xnList.Count " items found" -ForegroundColor Red
foreach($xn in $xnList)
{
Write-Host $xn.Name -ForegroundColor Red
$nList = $xdMig.SelectNodes("//"+$xn.Name)
$lItem = $list.Items.Add()
foreach($n in $migCols)
{
if($n.Attributes -ne $null)
{
$sourceCol = $n.Attributes.GetNamedItem("SourceCol").Value
$destCol = $n.Attributes.GetNamedItem("DestCol").Value
$destList = $n.Attributes.GetNamedItem("DestList").Value
Write-Host "Dest Col: " $destCol "- Sour Col: " $xn[$sourceCol].Name
Write-Host $destList -ForegroundColor Red
if($list.Title -eq $destList)
{
if($xn[$sourceCol] -ne $null )
{
if($list.Fields[$destCol] -ne $null)
{
$lItem[$destCol] = $xn[$sourceCol].InnerText
}
}else
{
Write-Host $sourceCol " was not matched" -ForegroundColor Yellow
}
}
}
}
$lItem.Update()
Write-Host "-----------------------------------"
}
}
}
}
}
}
InformationsquelleAutor Imir Hoxha | 2012-07-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte man kombinieren powershell mit xpath. Angenommen, Sie haben die Feste XML-Fehler und umbenannt
Element.Name
im gleichen Fall wie in der Daten-Datei:your_file.xml
fixed content:index_file.xml
fixed content:PoSH
map ' em:Ausgang gefolgt
und
Addieren Sie alle Werte auf assoziative container (auch Hashwert):
$allValues = @{}; $xml.SelectNodes("//text()") | % { $allvalues[$_.ParentNode.ToString()] = $_.Value }; $allValues | ft
Hallo akim, vielen Dank für deine Hilfe. Ich habe gerade ein paar Dinge in meiner Frage oben. Können Sie mir sagen, wie ich den Wert anzuzeigen, der jedes element nur, wenn das element in der Abfrage angegebene XML-Datei?
Funktioniert es nun mit beiden XMLs?
Hi akim, oben habe ich Hinzugefügt einige code, den ich bisher getan habe. Ich appologize für nicht nach Ihrer Beispiel. Ich bin mit xmldocument-da fand ich einige code, das funktioniert bis zu einem Punkt. Mein problem mit dem code ist, wenn ich 5 xml-Dateien hinzufügen, werden die Elemente des letzten xml dupplicated. Irgendeine Idee was mache ich falsch? Vielen Dank für Ihre Hilfe.
InformationsquelleAutor Akim
Lief ich in eine ähnliche Anforderung, wo ich brauchte, um einzutauchen in unterschiedlichen XML-Strukturen. Diese rekursive routine funktioniert gut für die meisten xml-habe ich laufen.
Die Ausgabe für die Datei 1 sieht wie folgt aus
Kombinierte ich die Dateien 1 und 2 erhalten folgende Ausgabe:
InformationsquelleAutor Jeff Greene