xml - 从 XML 中获取具有特定名称的所有节点的值

标签 xml powershell

我在使用从 XML 中获取具有特定名称的节点的所有值的最有效方法时遇到问题。

例如:

<h1>
<MyNode>Node One</MyNode>
<h2>
    <MyNode>Note Two</MyNode>
    <DiffrentNode>I dont want that</DiffrentNode>
    <h3>
        <MyNode>Node Three</MyNode>
    </h3>
</h2>
<HHH1>
    <MyNode>Node Four</MyNode>
</HHH1>
</h1>
<g2>
    <MyNode>Node Five</MyNode>
</g2>

我想从 XML 中获取这些值:

  • 节点一
  • 节点二
  • 节点三
  • 节点四
  • 节点五

我希望能够用这样的代码做同样的事情:

<h1>
<h2 MyArgument = "Argument One" Stuff = "I dont want that">
    <DiffrentNode>Something I dont want</DiffrentNode>
    <h3 MyArgument = "Argument Two" Stuff = "I dont want that too">
    </h3>
</h2>
<HHH1>
    <DiffrentNode>Something I dont want</DiffrentNode>
</HHH1>
</h1>
<g2 MyArgument = "Argument Three">
    <DiffrentNode>Something I dont want</DiffrentNode>
</g2>

并得到:

  • 论据一
  • 论点二
  • 论据三

有什么想法吗?到目前为止,我尝试这样做:

$xdoc = New-Object System.Xml.XmlDocument
$file = Resolve-Path("C:\CompiledDynoview.xml")
$xdoc.load($file)
[xml] $xdoc = Get-Content $file
$xdoc.h1.MyNode
$xdoc.h1.h2.MyNode
$xdoc.h1.h3.MyNode
...

但这似乎不是最好的方法。应该有更好的东西。

最佳答案

您在这里尝试做不同的事情,因此您将无法对这两个操作使用完全相同的代码。

在您的第一个示例中,您想要选择名称为 MyNode 的所有节点的值。选择带有 XPath expression 的节点//MyNode 并展开它们的 #text 属性。有多种方法可以做到这一点,例如 Select-Xml ,正如@PetSerAl 建议的那样:

Select-Xml -XPath '//MyNode' -Path 'C:\path\to\first.xml' |
  Select-Object -Expand Node |
  Select-Object -Expand '#text'

或通过将文件导入为 XmlDocument对象并使用其 SelectNodes()方法:

[xml]$xml = Get-Content 'C:\path\to\first.xml'
$xml.SelectNodes('//MyNode') | Select-Object -Expand '#text'

在您的第二个示例中,您希望从具有此特定属性的所有节点中选择属性 MyArgument 的值。使用 XPath 表达式 //@MyArgument 选择所有属性 MyArgument,然后像以前一样扩展它们的值,如下所示:

Select-Xml -XPath '//@MyArgument' -Path 'C:\path\to\second.xml' |
  Select-Object -Expand Node |
  Select-Object -Expand '#text'

或者像这样:

[xml]$xml = Get-Content 'C:\path\to\second.xml'
$xml.SelectNodes('//@MyArgument') | Select-Object -Expand '#text'

旁注:

$xml = New-Object System.Xml.XmlDocument
$xml.load('C:\path\to\your.xml')

[xml]$xml = Get-Content 'C:\path\to\your.xml'

做同样的事情,所以使用一个或另一个,而不是两个。

关于xml - 从 XML 中获取具有特定名称的所有节点的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34514343/

相关文章:

java - weblogic.xml : cvc-complex-type. 2.4.a 中的错误:发现以元素 'prefer-application-packages' 开头的无效内容

Python 元素树 : replacing elements in a loop

regex - 使用Powershell匹配文本文件中所有出现的模式

windows - 如何在 Ansible 的 win_environment 模块之后更新 Windows 环境变量?

azure - 使用从azure存储服务获取Blob时如何正确获取授权 header ?

c++ - 为什么日志记录输出显示在控制台主机中,而不显示在 ISE 中? (v4.0)

java - 请帮助我的应用程序在我的手机和模拟器上不断崩溃

c# - "Type ' http ://www. w3.org/2000/09/xmldsig# :SignatureType ' is not declared" in XmlDocument. 验证(...)

android - BottomAppBar无法正确加载

powershell - 检测以相同名称运行的进程数