在 PowerShell 中打印 XmlElement 名称
我有一个 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
你可以这样做:
You can do something like this:
您可以使用 LocalName 属性,因为您没有在 XML 中使用命名空间:
You could use the LocalName property instead as you're not using namespaces with your XML:
虽然 manoljlds 解决方案适用于获取父节点中子节点的所有元素名称,但它对于单个元素或当您想要将元素名称与元素一起使用时没有帮助。我最终只使用了反射。
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.
请注意,如果存在名称为“name”的属性,它将返回该属性的值,而不是元素的值。为了保证您获得正确的值,您可以使用 get_name() 方法,但您需要注意 null,因为您正在使用方法。
示例:
输出:
使用 get_Name()
输出:
还请记住,您可以在数组上使用方法,但您需要小心,因为如果数组项为空,它将失败。
例如 @($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:
output:
using get_Name()
output:
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.