在 PowerShell 中打印 XmlElement 名称

发布于 2024-12-01 02:19:15 字数 627 浏览 0 评论 0原文

我有一个 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 文件如何,该解决方案始终有效。

I have a XML document:

<Root>
  <ItemA Name="1" />
  <ItemB Name="2" />
  <ItemC Name="3" />
</Root>

and a powershell script accessing data from that document. I need to iterate by the children of Root and print the element names of its children. Example:

$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

Update: As MrKWatkins correctly pointed out below in this case I could use the LocalName property instead. However this will not work if I'm using namespaces of if I also have a LocalName attribute in my XML. I would like to know if exists a solution for this problem that always works no matter the XML file.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

情愿 2024-12-08 02:19:15

你可以这样做:

$xml.Root | gm -MemberType property | select Name

You can do something like this:

$xml.Root | gm -MemberType property | select Name
昵称有卵用 2024-12-08 02:19:15

您可以使用 LocalName 属性,因为您没有在 XML 中使用命名空间:

$xml.Root.ChildNodes | foreach { $_.LocalName }

You could use the LocalName property instead as you're not using namespaces with your XML:

$xml.Root.ChildNodes | foreach { $_.LocalName }
2024-12-08 02:19:15

虽然 manoljlds 解决方案适用于获取父节点中子节点的所有元素名称,但它对于单个元素或当您想要将元素名称与元素一起使用时没有帮助。我最终只使用了反射。

$xml.Root.ChildNodes | % { $_.GetType().GetProperty("Name").GetValue($_, $null); }

While manoljlds solution works for getting all element names of children in a parent node, it doesn't help for single elements or when you want to use the element name with the element. I ended up just using Reflection.

$xml.Root.ChildNodes | % { $_.GetType().GetProperty("Name").GetValue($_, $null); }
笑看君怀她人 2024-12-08 02:19:15

请注意,如果存在名称为“name”的属性,它将返回该属性的值,而不是元素的值。为了保证您获得正确的值,您可以使用 get_name() 方法,但您需要注意 null,因为您正在使用方法。

示例:

([xml]"<myelement name='attributename'/>").myelement.name

输出:

attributename

使用 get_Name()

([xml]"<myelement name='attributename'/>").myelement.get_name()

输出:

myelement

还请记住,您可以在数组上使用方法,但您需要小心,因为如果数组项为空,它将失败。

例如 @($elem1,$null,$Elemen2).get_name() 将抛出错误。

be careful, if there is an attribute whose name is "name" it will return the value of the attribute, not the element. To guarantee you get the correct value you can use get_name() method but you need to watchout for null since you are using a method.

example:

([xml]"<myelement name='attributename'/>").myelement.name

output:

attributename

using get_Name()

([xml]"<myelement name='attributename'/>").myelement.get_name()

output:

myelement

Also remember you can use a method on an array, but you need to be careful because if an array item is null it will fail.

e.g. @($elem1,$null,$Elemen2).get_name() will throw an error.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文