【问题标题】:Powershell getting node values of different levels in one Select-ObjectPowershell在一个Select-Object中获取不同级别的节点值
【发布时间】:2021-06-01 06:52:13
【问题描述】:

有没有办法做一个Select-Object并获取不同级别节点的值?

我需要字段级别的名称和一堆字段,还需要 globalFormat 类别类型。 有没有办法将它们放在一个 Select-Object 中?

XML

<field name="FLD0000001" tableAlias="*SERVER" tableName="*SERVER">
  <order>0</order>
  <version></version>
  <afterEditEvent></afterEditEvent>
  <format></format>
  <globalFormat categoryType="Number" countrySymbolCode="" dateFormat="" timeFormat="" imageFormat="None" decimalPlaces="2" leadingZero="0" isCentury="false" negativeFormat="NegativeSymbol" />
  <columnGroupHeading></columnGroupHeading>
  <dataFieldType>20</dataFieldType>
  <columnHeading><![CDATA[FLD0000001]]></columnHeading>
  <hideHeader>False</hideHeader>
  <groupable>0</groupable>
  <subTotal>0</subTotal>
  <calculation></calculation>
  <jScriptCalculation />
  <editCalculation scriptContent="" scriptDisplayContent="">
    <tokens />
    <triggers />
  </editCalculation>
  <onCalculationEvent></onCalculationEvent>
  <onValidationEvent></onValidationEvent>
  <editableAdvanced></editableAdvanced>
  <addRequired>0</addRequired>
  <splitByRationOn></splitByRationOn>
  <defaultValue></defaultValue>
  <isCalculatable>0</isCalculatable>
  <isUpdatable>0</isUpdatable>
  <visibleAdvanced></visibleAdvanced>
  <editableLevel>0</editableLevel>
  <visibleLevel>10</visibleLevel>
  <fullTypeName></fullTypeName>
  <dataType>NUMERIC</dataType>
  <dataLength>5</dataLength>
  <description source="" format="4"></description>
  <dimensionTitle></dimensionTitle>
  <definition></definition>
  <parameterName></parameterName>
  <cubeDimensionOrder>0</cubeDimensionOrder>
  <subTotalRestrictions></subTotalRestrictions>
  <subTotalExceptions></subTotalExceptions>
  <matrixHeaderValue></matrixHeaderValue>
  <promptRestricted>0</promptRestricted>
  <prompt processId="" />
  <promptOption></promptOption>
  <sortOrderForPrompt>NONE</sortOrderForPrompt>
  <filterForPrompt></filterForPrompt>
  <relatedFields></relatedFields>
  <validateAgainstPrompt>False</validateAgainstPrompt>
  <subGroupId></subGroupId>
  <indexInGroup>0</indexInGroup>
  <widthInFieldArea>2000</widthInFieldArea>
</field>

我基本上是想检查dataFieldType,如果是20还是21,检查globalFormat categoryType看是不是没有,如果是,在文件中输出为未正确设置的Field。但我喜欢该 xml 中的数百个字段

【问题讨论】:

  • 你能提供一些 XML 的子集作为文本吗?顺便说一句,我想你的意思是Select-Xml
  • 对不起,我不太明白你想说什么。我正在尝试使用图像中所有字段的所有值创建一个变量,并在后续变量中获取该变量的子集以执行不同的 QA 文本,以查看我是否正确设置了字段,
  • 发布代码和/或示例数据的图片通常不受欢迎。人们无法测试他们的建议。您能否创建一个经过净化但具有代表性的 XML 版本以用于该问题。如果是这样,请编辑并用 XML 替换图像...
  • 更新了,够了吗?
  • 是的,这绝对是一个开始。我必须走开,但很快就会看看。

标签: powershell select-object


【解决方案1】:

您可以将Select-XmlXPath 查询和Select-Object 结合使用来获取您需要的元素和属性值。我相信您可以指定不同的XPaths 来访问不同的节点级别,包括元素属性。

请参阅Microsoft docs 中的这些示例:

$Path = "$Pshome\Types.ps1xml"
$XPath = "/Types/Type/Members/AliasProperty"
Select-Xml -Path $Path -XPath $Xpath | Select-Object -ExpandProperty Node
Name                 ReferencedMemberName
----                 --------------------
Count                Length
Name                 Key
Name                 ServiceName
RequiredServices     ServicesDependedOn
ProcessName          Name
Handles              Handlecount
VM                   VirtualSize
WS                   WorkingSetSize
Name                 ProcessName
Handles              Handlecount
VM                   VirtualMemorySize
WS                   WorkingSet
PM                   PagedMemorySize
NPM                  NonpagedSystemMemorySize
Name                 __Class
Namespace            ModuleName

例如,如果您想获取 globalFormat 元素的属性,您可以执行以下操作:

$path = "\test.xml"
$xpath = "/field/globalFormat"
Select-Xml -Path $path -XPath $xpath | Select-Object -ExpandProperty Node

categoryType      : Number
countrySymbolCode :
dateFormat        :
timeFormat        :
imageFormat       : None
decimalPlaces     : 2
leadingZero       : 0
isCentury         : false
negativeFormat    : NegativeSymbol

如果你想同时访问不同的元素和属性,你可以这样做:

$path = "test.xml"
$xpathField = "/field"
$xpathGlobalFormat = "/field/globalFormat"
$field = Select-Xml -Path $path -XPath $xpathField | Select-Object -ExpandProperty Node
$globalFormat = Select-Xml -Path $path -XPath $xpathGlobalFormat | Select-Object -ExpandProperty Node
$field.tableName # this returns *SERVER
$globalFormat.categoryType # this returns Number

【讨论】:

  • 试过,但我得到的结果与我最初得到的结果相同(字段级别的节点,但不是 globalFormat 的子节点(或者它是属性?))与 xpath“字段/字段” .如果我在 xpath 中添加 * 之后,我会得到一个奇怪的结果,字段外的节点会出来......我做错了什么吗?
  • @JY 查看我编辑的答案。我尝试在评论中回答,但没有意识到降价是有限的。另外,请参阅 Steven 的回答,看起来他对我的扩展有点。
  • 我也设法获得了类似的结果,但我无法访问表格别名和表格名称等内容,有没有办法将它们全部集中在一个 Select 中?
  • @JY 查看我编辑的答案,最后一个示例显示了如何访问字段元素属性以及 globalFormat 属性而不会“失去访问权”。可能还有其他方法,但这种方法只是将返回的对象存储到变量中,以便您可以访问属性并在脚本的其他部分使用它们。
  • 问题在于我有超过 100 个要检查的 xml,每个人都有超过 100 个“字段”节点。如果我这样带它们,我认为它们不同步,因为它们是 2 个不同的对象。我应该在字段节点上做一个循环并改用这种方法吗?
【解决方案2】:

Alex's helpful answer 为基础,我认为您正在寻找一个XPath 查询,您可以利用它来一次性获取信息。我在想这样的事情:

(Select-Xml -Xml $Xml -XPath "/field/@* | /field/globalFormat/@categoryType").Node

我不确定您要查找什么输出,但另一种选择是简单地选择字段节点并使用“。”引用获取子属性来构造自定义对象。

获取/field AND /field/globalFormat下的所有元素和属性:

(Select-Xml -Xml $Xml -XPath '/field | /field/globalFormat').Node

【讨论】:

  • 啊,我期待的输出是字段级别的所有值(名称、表别名、表名等)+ categoryType(我只需要这个,但拥有它并没有什么坏处更多)对于每个存在的字段。
  • 我认为您可以在 XPath 查询中添加任意数量的|。我认为让我们感到困惑的是,您希望所有内容都包含在 1 个语句中。
  • 在一个语句中包含所有内容会使事情变得更容易,但我想如果它变得复杂,我需要一个替代方案。我有超过 100 个 xml,每个都有超过 100 个字段节点,所以我想将它们作为一个“数组”或“行”来使用,以便更轻松地使用 where 选项进行检查。
  • 老实说,我是 powershell 的初学者,我想我正在尝试为它带来更多的 sql 格式,以便我更容易编码。
  • 啊,对不起,我在一天结束的时候尝试过,但没有得到我想要的结果,但这是因为我忘记更改你的 xpath,因为我的 xml 与你的不同,这个完美运行,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
  • 2014-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多