在PowerShell中打印XmlElement名称

时间:2011-08-22 15:01:18

标签: xml powershell

我有一个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文件是什么都可以。

4 个答案:

答案 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()将引发错误。