Powershell XML子节点返回更深的节点

Powershell XML子节点返回更深的节点,xml,powershell,Xml,Powershell,一段时间以来,我一直在使用.SelectNodes()来获取特定节点的子节点,它可以工作,但随着文件变大,速度似乎会变慢。所以我开始使用.ChildNodes,我发现它得到的不仅仅是子节点,它更深入地得到了大的子节点。 鉴于此 $xml = [Xml]@" <root> <one> <element1>element text</element1> <element2>element text&l

一段时间以来,我一直在使用
.SelectNodes()
来获取特定节点的子节点,它可以工作,但随着文件变大,速度似乎会变慢。所以我开始使用
.ChildNodes
,我发现它得到的不仅仅是子节点,它更深入地得到了大的子节点。 鉴于此

$xml = [Xml]@"
<root>
   <one>
      <element1>element text</element1>
      <element2>element text</element2>
      <two>
        <element3>element text</element3>
      </two>
      <name>Name text</name>
   </one>
</root>
"@
foreach ($element in $xml.DocumentElement.ChildNodes | where {$_.NodeType -eq 'Element'}) {
    Write-Host "$($element.Name) $($element.InnerText)"
}
$xml=[xml]@”
元素文本
元素文本
元素文本
名称文本
"@
foreach($xml.DocumentElement.ChildNodes中的元素|其中{$\ NodeType.NodeType-eq'element'}){
写入主机“$($element.Name)$($element.InnerText)”
}
我希望只返回单个
节点,因为它是root的唯一子节点。但我得到的是
Name text element textfelement textName text
,这对我来说毫无意义。尤其是因为我至少希望有多个项目,最后一行是
name text
。相反,行中的第一项是最后一个节点的名称。 现在我知道给节点命名“name”是个坏主意,我正在编写代码来解决这个问题。但是,即使我更改了该节点的名称,所以
name text
,我得到的是另一种错误,
one-element textelement textName text
。 那么,我做错了什么?还有,甚至可以使用
.ChildNodes
只获取实际的子节点,而不获取更深的子节点吗? 这是怎么回事?正如我所怀疑的那样,如果我能理解为什么矮牵牛花碗会这么说,我就会更好地理解宇宙

我本来希望只返回单个
节点

事实上,这就是您得到的结果,尽管从默认的显示格式来看这并不明显

相反,行中的第一项是最后一个节点的名称

可视化XML节点的最简单形式是访问其属性,该属性返回节点及其所有子节点的XML文本表示形式

将给定元素的子元素和属性表示为该元素的属性,并且此类属性会影响(覆盖)基础实例的本机属性:

  • 因此,
    子元素(或属性)会隐藏类型native
    Name
    属性,这就是输出中出现
    Name text
    的原因

  • 正如所指出的,解决方法是使用隐藏的
    .get\u Name()
    方法

但是,即使我更改了该节点的名称,所以
name text
,我得到的是另一种错误,
one-element textelement textName text

该结果没有任何错误:它反映了目标节点的元素名称,
one
,然后是它包含的文本节点在子节点层次结构中的直接连接(请参见),也就是说,您看到了以下字符串连接的结果:
“元素文本”+“元素文本”+“元素文本”+“文本”

我本来希望只返回单个
节点

事实上,这就是您得到的结果,尽管从默认的显示格式来看这并不明显

相反,行中的第一项是最后一个节点的名称

可视化XML节点的最简单形式是访问其属性,该属性返回节点及其所有子节点的XML文本表示形式

将给定元素的子元素和属性表示为该元素的属性,并且此类属性会影响(覆盖)基础实例的本机属性:

  • 因此,
    子元素(或属性)会隐藏类型native
    Name
    属性,这就是输出中出现
    Name text
    的原因

  • 正如所指出的,解决方法是使用隐藏的
    .get\u Name()
    方法

但是,即使我更改了该节点的名称,所以
name text
,我得到的是另一种错误,
one-element textelement textName text

该结果没有任何错误:它反映了目标节点的元素名称,
one
,然后是它包含的文本节点在子节点层次结构中的直接连接(请参见),也就是说,您看到了以下字符串连接的结果:

'element text'+'element text'+'element text'+'text'

$xml.ChildNodes
返回元素
one
.DocumentElement
属性表示XML树的根…因此此时已选择根节点。您会注意到,
$xml.DocumentElement.ChildNodes
没有显示element3元素。因此,它只显示子层。XmlElement对象上有一个名为
Name
的隐藏属性。它是由
Get\u Name()
返回的值。如果您有一个名为
Name
的节点,它将优先于隐藏属性value.Hmm。在某个时候,我发现我需要
.DocumentElement
才能让它工作,但我不记得确切的原因。进一步的测试表明,
.InnerText
返回节点内的所有内容,包括子节点,这是问题的一部分。我希望
.InnerText
对于
都是空白的,因为它们实际上都没有文本,这正是我所认为的InnerXml。使用
选择Xml
似乎简单得多-->
(选择Xml-content$x-xpath/*/*”)。节点|%{{0}:{1}“-f$\uu.Get\u Name(),$\u35; text'}
其中
$x
是xml字符串。避免使用XPATH方法会使事情变得更加复杂。否则,您必须跟踪节点名称-->
$props=($xml.DocumentElement.ChildNodes | gm-membertype属性);foreach($xml.DocumentElement.ChildNodes中的元素|?{$|.NodeType-eq'element}){$props |%{$|($element.$|)?