【问题标题】:Powershell, xml and xmlrpcPowershell、xml 和 xmlrpc
【发布时间】:2018-06-05 12:50:12
【问题描述】:

所以,我正在编写一个脚本来执行一些简单的 xmlrpc 请求。据我所知,Powershell 没有内置任何东西,所以我发现的最好和最简单的解决方案是简单地创建 xml 并使用 invoke-webrequest 或 invoke-restmethod 发布它。

如果有人知道开箱即用功能的更好方法,请随时教育我。

现在,这是我遇到问题的部分。生成xml。我希望它如何工作: 创建一个自定义对象,添加属性,转换为 xml 并发布。更好的是创建一个 xml 对象,添加节点和属性,然后发布它。

不过,这似乎有点像 PITA,在这一点上,我觉得在 Powershell 中将 xml 视为字符串并以这种方式编辑/管理它会更容易。那么,我是否遗漏了什么,或者在 Powershell 中使用 xml 不像我希望的那么容易?

编辑:为了澄清,我要求在 Powershell 中创建自定义 xml 的最佳工具/技术。到目前为止,我的印象是最好的方法是简单地将其构建为字符串,因为使用内置的 xml 工具既麻烦又混乱。但是我意识到这对于更大或更复杂的 XML 结构是不可行的。

到目前为止,我所拥有的东西不起作用,也没有我想要的那么漂亮。 这段代码给了我以下错误

方法调用失败,因为 [System.String] 不包含名为“Appendchild”的方法。

$xmlreq = [xml]@'
<?xml version="1.0"?>
<methodCall>
<methodName>methodname</methodName>
</methodCall>
'@

$child = $xmlreq.CreateElement("params")
$xmlreq.methodCall.Appendchild($child)
$child = $xmlreq.CreateElement("param")
$xmlreq.methodCall.params.Appendchild($child)
$child = $xmlreq.CreateElement("value")
$xmlreq.methodCall.params.param.Appendchild($child)
$child = $xmlreq.CreateElement("string")
$xmlreq.methodCall.params.param.value.Appendchild($child)
$xmlreq.methodCall.params.param.value.string = "value"

生成的 XML 应该是什么样子:

<?xml version="1.0"?>
<methodCall>
<methodName>methodname</methodName>
<params>
<param>
<value>
<string>param1</string>
</value>
</param>
<param>
<value>
<string>param2</string>
</value>
</param>
<param>
<value>
<string>param3</string>
</value>
</param>
<param>
<value>
<string>param4</string>
</value>
</param>
<param>
<value>
<struct>
<member>
<name>property1</name>
<value>
<int>0</int>
</value>
</member>
<member>
<name>property2</name>
<value>
<string>value</string>
</value>
</member>
<member>
<name>property3</name>
<value>
<int>1</int>
</value>
</member>
<member>
<name>property4</name>
<value>
<string>value</string>
</value>
</member>
<member>
<name>property5</name>
<value>
<int>2</int>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>

【问题讨论】:

  • 您的问题到底是什么?有错误吗? XML 不是按照你喜欢的方式出来的吗?
  • 您尝试过什么,您尝试过什么失败了?理想情况下,您应该提供一个minimal reproducible example 来说明您的尝试,并包含有关它如何失败的具体信息,以及错误消息和/或错误输出Stack Overflow 不是代码编写服务;最好的问题是那些提供有用信息的问题,以便回答的人可以指导您设计自己的正确答案。请参阅How to Ask 一个好问题。
  • 此外,还有用于 Powershell(例如 github.com/mosserlee/PSClient-for-XML-RPC)和 .NET 的 XMLRPC 实现,您可以将它们集成到您的脚本中。尝试使用已经存在的东西,而不是滚动你自己的实现。
  • 对不起,我会尽量澄清:我现在的主要问题是在 powershell 中创建和编辑 xml 文件的最佳方法是什么?不使用现有 XML-RPC 实现的原因有两个,首先,我将其用作学习的练习,其次,我更喜欢我的解决方案小型、可移植且不依赖于操作中未包含的组件系统。
  • 因此,在查看了您发布的项目中的代码后,我发现他们确实将 xml 视为字符串,而不是使用 Powershell 内置的 XML 解析。这让我相信,至少我不是唯一一个发现 Powershell 与 XML 交互的方式有点欠缺的人。

标签: xml powershell xml-rpc


【解决方案1】:

尝试这样的方法来构建你的树:

[xml]$doc = @'
<?xml version="1.0"?>
<methodCall>
<methodName>methodname</methodName>
</methodCall>
'@

$node1 = $doc.CreateElement('params')
$node2 = $doc.CreateElement('param')
$node3 = $doc.CreateElement('value')
$node4 = $doc.CreateElement('string')

$node4.set_innertext('param1')
$node3.AppendChild($node4)
$node2.AppendChild($node3)
$node1.AppendChild($node2)

$node2 = $doc.CreateElement('param')
$node3 = $doc.CreateElement('value')
$node4 = $doc.CreateElement('string')

$node4.set_innertext('param2')
$node3.AppendChild($node4)
$node2.AppendChild($node3)

$node1.AppendChild($node2)

$doc.methodCall.AppendChild($node1)

$doc.Save("$(pwd)\foo.xml")
cat .\foo.xml

这只是一个快速而肮脏的例子来证明一个观点。您需要根据自己的需要对其进行润色。我做了以下事情:

  • xml 类型声明移动到变量而不是字符串。
  • 先构建树,然后将其添加到文档中

希望这会有所帮助!

【讨论】:

  • 太棒了,非常感谢 :) 我想我现在明白了它是如何工作的,我想我可以在它的基础上得到我想要的。
【解决方案2】:

带有一些辅助函数的 Xlinq 使得在 PowerShell 中构建 XML 文档变得相对容易。例如:

function xdoc ($nodes) { [system.xml.linq.xdocument]::new( [System.Xml.Linq.XDeclaration]::new("1.0", "utf8", ""), [object[]] $nodes) }

function xe ($name, $value, $rest) { [xml.linq.xelement]::new($name, $value) }

function param ($p) {xe param $(xe value $(xe string $p))}

$d = xdoc $(
    xe methodcall $(
        xe methodname methodname
        xe params $(
            param param1
            param param2
            param param3
            param param4
            xe param $(
                xe value $(
                    xe struct $(
                        xe int 0
                    )
                )
            )
        )
    )
)

【讨论】:

    猜你喜欢
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 2023-03-18
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 2011-03-21
    相关资源
    最近更新 更多