草庐IT

xml - 并非所有 XML 属性都通过管道传递

coder 2024-06-26 原文

我正在编写一个相当重要的 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

效果很好。

现在,如果第一个节点没有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

明确命名属性会导致错误,因为可以在没有警告的情况下添加属性。如果可能,我希望保持代码的灵 active 以处理新属性。

我想我可以使用“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 元素肯定是“通过管道传递”。您看到的是 format-table 的一个特性:它只查看列表中的第一个对象以确定要打印的列。

这主要是出于性能原因。否则 format-table 将不得不迭代列表两次 - 一次确定要输出哪些属性,第二次实际输出它们。另外,列表中的项目通常是统一的。

在所有其他情况下,“显式优于隐式”规则适用:

$stuff.members.member | ft name, rank, serialnumber -AutoSize

关于xml - 并非所有 XML 属性都通过管道传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18212777/

有关xml - 并非所有 XML 属性都通过管道传递的更多相关文章

  1. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  2. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  3. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  4. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  5. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  6. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  7. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  8. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  9. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  10. ruby-on-rails - Enumerator.new 如何处理已通过的 block ? - 2

    我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m

随机推荐