我有一些XML数据具有很多属性和多个具有相同名称的元素,我想将它们压缩为CSV文件。数据XML看起来是这样的:PowerShell中的XML父项和子项属性和元素
<?xml version="1.0" encoding="utf-8"?>
<SEGMENTS>
<SEGMENT NAME="webcluster">
<RESULTPAGE>
<RESULTSET FIRSTHIT="1" LASTHIT="100" HITS="100" TOTALHITS="100">
<HIT NO="1" RANK="19000" SITEID="0" MOREHITS="100">
<FIELD NAME="rank">19000</FIELD>
<FIELD NAME="id">1</FIELD>
<FIELD NAME="url">C:\website.com\folder1\file1.txt</FIELD>
<FIELD NAME="filename">file1.txt</FIELD>
<FIELD NAME="path">https://website.com/folder1/</FIELD>
</HIT>
<HIT NO="2" RANK="19000" SITEID="0" MOREHITS="100">
<FIELD NAME="rank">19000</FIELD>
<FIELD NAME="id">2</FIELD>
<FIELD NAME="url">C:\website.com\folder1\file2.txt</FIELD>
<FIELD NAME="filename">file2.txt</FIELD>
<FIELD NAME="path">https://website.com/folder1/</FIELD>
</HIT>
<HIT NO="3" RANK="18999" SITEID="0" MOREHITS="100">
<FIELD NAME="rank">18999</FIELD>
<FIELD NAME="id">3</FIELD>
<FIELD NAME="url">C:\website.com\folder5\file3.txt</FIELD>
<FIELD NAME="filename">file3.txt</FIELD>
<FIELD NAME="path">C:\website.com\folder\</FIELD>
</HIT>
</RESULTSET>
</RESULTPAGE>
</SEGMENT>
</SEGMENTS>
而且我想遍历它来产生这样的
我的代码是:
[xml]$xml=Get-Content .\xmlfile.xml
$hits = $xml.segments.segment.resultpage.resultset.hit
foreach($hit in $hits)
{
foreach($field in $hit.field)
{
if (field."NAME" -eq 'url')
{
write-output $hit.no $field."#VALUE"
}
}
}
我不断收到错误。我可以通过序号位置($ hits [0] .field [4])引用它们来访问不同的元素和属性,但是我希望在FIELD值可能不同的顺序时防止将来的输出。
任何人都可以建议我如何做到这一点?我尝试使用select-XML,发现更麻烦,但也许这是更优雅的方法。
这工作!谢谢! 有人建议离线: '[XML] $ hitfile =获取内容fastxml.xml '的foreach($创下$ hitfile.segments.segment.resultpage.resultset.hit) '{ '$行= $ mjatable .NewRow() '$ row.Hit = $ hit.No '$ row.InternalID = $ hit.field | ?{$ _。name -eq'Internalid'} | foreach {$ _。'#text'} '$ row.URL = $ hit.field | ?{$ _。name -eq'url'} | foreach {$ _。'#text'} '$ mjaTable.Rows.Add($ row) '} '$ mjaTable | format-table -AutoSize – MJA
我仍然很好奇,如果可以使用NAME attrib =(“url”或“Internalid”)来引用一个FIELD元素而不使用WHERE-OBJECT过滤器来检索'#text'值,但是如果不是,这两个解决方案完成了工作 再次感谢! – MJA
评论中的代码是PITA,更新了答案 – user1578107