在一个标记

时间:2017-01-24 01:54:12

标签: xml file powershell oop parsing

自定义应用程序的XML配置不当,因此我想要的所有数据都在一个标记之间,如下所示:

<PersonArray>
    <PersonInfo PersonName="" FavoriteFood="Ice Cream" 
             Username="friendlyperson" Location="Detroit"/>
</PersonArray>

这是一个数组,所以这些人中的多个将以相同的方式添加到<PersonArray>标记中。如果我想将每个Person存储到一个对象中,每个属性都是这些头之一(PersonName,FavoriteFood等),我怎样才能最有效地将这个可怜的XML转换为对象?

2 个答案:

答案 0 :(得分:2)

尝试类似这样的事情

[xml] $xml=gc "C:\temp\test.xml" 
$xml.SelectNodes("PersonArray/PersonInfo")

答案 1 :(得分:1)

Esperento57's elegant answer显示如何<PersonInfo>元素提取为[System.Xml.XmlElement]个实例。
(一个小小的警告是PowerShell Core (PowerShell的跨平台版本)中没有.SelectNodes()方法。

这可能是所有需要的,因为这些实例具有反映XML属性的属性(例如PersonNameLocation,...)

相比之下,如果您想要自定义对象 - 仅限于反映XML属性的NoteProperty成员的普通对象 - 需要做更多工作

# Sample input XML.
$xml = @'
<PersonArray>
    <PersonInfo PersonName="P1" FavoriteFood="Ice Cream" 
             Username="friendlyperson1" Location="Detroit" />
    <PersonInfo PersonName="P2" FavoriteFood="Cabbage" 
             Username="friendlyperson2" Location="Buffalo" />
</PersonArray>
'@

# Load the XML string into an XML document.
[xml] $doc = $xml

# Loop over the child nodes and turn each child element into a custom object
# based on its attributes.
$objs = $doc.ChildNodes | ForEach-Object {
  # Get the names of the `Property`-type members, which correspond
  # to the XML attributes.
  $propNames = ($_.ChildNodes | Get-Member -MemberType Property).Name
  # Create a custom object that only contains properties reflecting
  # the XML attribute.
  $_.ChildNodes | Select-Object -Property $propNames
}

# Output the resulting custom objects.
$objs