gpt4 book ai didi

c# - 使用Powershell遍历xml元素

转载 作者:行者123 更新时间:2023-12-03 01:21:55 25 4
gpt4 key购买 nike

我有一些具有不同元素的xml文件。我想用C#或powershell编写一些代码,这些代码遍历每个元素并获取值。
我希望它足够通用,以便可以与其他xml文件一起使用。所有xml文件都具有相同的格式,但是元素的名称会延迟。

非常感谢你的帮助。

<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>

引入了另一个xml,它将作为上述xml文件中元素迭代的基础。

根据下面每个元素的属性获取上面元素的值:
<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 "-----------------------------------"
}

}
}
}
}
}

最佳答案

您可以将结合使用。假设您有固定的XML错误,并且已将Element.Name重命名为与数据文件中的情况相同:
your_file.xml固定内容:

<root> 
<list>
<FirstName>Abc</FirstName>
<LastName>LT</LastName>
<Occupation>Eng</Occupation>
<BirthDate></BirthDate>
...
</list>
</root>
index_file.xml固定内容:
<root> 
<Element Name="FirstName" />
<Element Name="LastName" />
<Element Name="Occupation" />
<Element Name="Java" />
<Element Name="NET" />
...
</root>
PoSH映射到他们:
$xmlIndex = [xml](gc ".\index_file.xml")
$xml = [xml](gc ".\your_file.xml")
$allValues = @{};

$xmlIndex.SelectNodes("//Element/@Name") |
%{ $nodeName = $_."#text"; $xml.SelectNodes("//$nodeName/text()") } |
% { $allvalues[$_.ParentNode.ToString()] = $_.Value };

$allValues | ft

输出将被跟随
Name                           Value
---- -----
Occupation Eng
FirstName Abc
LastName LT


Name                           Value
---- -----
NET b
Java Ab

关于c# - 使用Powershell遍历xml元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11702237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com