【发布时间】:2013-08-13 23:30:52
【问题描述】:
我正在编写一个相当重要的 Posh 模块,作为一组 RESTful Web 服务的 CLI 前端。我有一个奇怪的问题,我已经能够描述,但没有找到一个干净的解决方案。
我并不总是知道期望什么属性,一些节点可能具有某个属性,而其他节点可能没有该属性。我的问题有时(阅读:经常)如果所有节点中都不存在某个属性,则它不会被传递到任何节点的管道中。它似乎与 XML 中第一个节点中的属性有关。
举一个非常简单的例子,考虑这是一个 XML 文件 example.xml 的内容:
<members>
<member>
<name>Joe</name>
<rank>Grand Poobah</rank>
<serialnumber>1234</serialnumber>
</member>
<member>
<name>Fred</name>
<serialnumber>1234</serialnumber>
</member>
</members>
我导入它并将其分配给一个 xml 转换变量:
[xml]$stuff = Get-Content .\example.xml
然后我将其通过管道传输到格式表(或 out-gridview、export-csv 等)
$stuff.members.member | ft -AutoSize
name rank serialnumber
---- ---- ------------
Joe Grand Poobah 1234
Fred 1234
效果很好。
现在,如果 FIRST 节点没有 rank 属性:
<members>
<member>
<name>Fred</name>
<serialnumber>1234</serialnumber>
</member>
<member>
<name>Joe</name>
<rank>Grand Poobah</rank>
<serialnumber>1234</serialnumber>
</member>
</members>
现在,当我执行相同的导入并将其传递到管道时,“rank”属性不会沿管道传递。
$stuff.members.member | ft -AutoSize
name serialnumber
---- ------------
Fred 1234
Joe 1234
我可以通过显式命名属性来强制它:
$stuff.members.member | select-object -Property name, rank, serialnumber | ft
name rank serialnumber
---- ---- ------------
Fred 1234
Joe Grand Poobah 1234
明确命名属性是错误的秘诀,因为可以在没有警告的情况下添加属性。如果可能的话,我想保持代码灵活处理新属性。
我以为我可以使用“select-object -property *”,但这添加了很多我不想要的 powershell 插入 XML 内容,并且仍然没有管道 rank 属性。
$stuff.members.member | select-object -Property *| ft -AutoSize
name serialnumber LocalName NamespaceURI Prefix NodeType ParentNode OwnerDocument IsEmpty Attributes
---- ------------ --------- ------------ ------ -------- ---------- ------------- ------- ----------
Fred 1234 member Element members #document False {}
Joe 1234 member Element members #document False {}
有谁知道处理这种情况的好方法吗?我在 Google 搜索中没有找到任何好的线索。
【问题讨论】:
标签: xml powershell