我有一个XML文档:
<Root>
<ItemA Name="1" />
<ItemB Name="2" />
<ItemC Name="3" />
</Root>
和一个访问该文档数据的powershell脚本。我需要按Root的子节点进行迭代并打印其子节点的元素名称。例如:
$xml = [xml](gc MyXmlFile.xml);
$xml.Root.Name
# prints "Root"
$xml.Root.ChildNodes | foreach { $_.Name }
# prints 1 2 3 because Item(A|B|C) have an attribute named "Name"
# I need to print ItemA ItemB ItemC
更新:正如MrKWatkins在本案例中正确指出的那样,我可以使用LocalName属性。但是,如果我使用的命名空间,如果我的XML中也有LocalName属性,那么这将无效。我想知道是否存在一个解决这个问题的解决方案,无论XML文件是什么都可以。
答案 0 :(得分:7)
您可以这样做:
$xml.Root | gm -MemberType property | select Name
答案 1 :(得分:3)
您可以使用LocalName属性,因为您没有在XML中使用名称空间:
$xml.Root.ChildNodes | foreach { $_.LocalName }
答案 2 :(得分:1)
虽然manoljlds解决方案适用于获取父节点中子节点的所有元素名称,但它对单个元素没有帮助,或者当您想要将元素名称与元素一起使用时。我最后只使用了反射。
$xml.Root.ChildNodes | % { $_.GetType().GetProperty("Name").GetValue($_, $null); }
答案 3 :(得分:0)
注意,如果存在一个名称为“ name”的属性,它将返回该属性的值,而不是元素。为了确保您获得正确的值,可以使用get_name()方法,但由于使用的是方法,因此需要注意null。
示例:
([xml]"<myelement name='attributename'/>").myelement.name
输出:
attributename
使用get_Name()
([xml]"<myelement name='attributename'/>").myelement.get_name()
输出:
myelement
还请记住,您可以在数组上使用方法,但是您需要小心,因为如果数组项为null,则它将失败。
例如@($ elem1,$ null,$ Elemen2).get_name()将引发错误。