自定义应用程序的XML配置不当,因此我想要的所有数据都在一个标记之间,如下所示:
<PersonArray>
<PersonInfo PersonName="" FavoriteFood="Ice Cream"
Username="friendlyperson" Location="Detroit"/>
</PersonArray>
这是一个数组,所以这些人中的多个将以相同的方式添加到<PersonArray>
标记中。如果我想将每个Person存储到一个对象中,每个属性都是这些头之一(PersonName,FavoriteFood等),我怎样才能最有效地将这个可怜的XML转换为对象?
答案 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属性的属性(例如PersonName
,Location
,...)
相比之下,如果您想要自定义对象 - 仅限于反映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