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.$|)?