Powershell,xml 和 xmlrpc

Powershell, xml and xmlrpc

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

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

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

虽然这看起来有点像 PITA,但在这一点上,我觉得在 Powershell 中将 xml 视为字符串会更容易,而 edit/manage 也是如此。那么,我是不是遗漏了什么,或者在 Powershell 中使用 xml 并不像我希望的那么容易?

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

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

方法调用失败,因为 [System.String] 不包含名为 'Appendchild'.[= 的方法13=]

$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]$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 类型声明移动到变量而不是字符串。
  • 先构建树,然后将其添加到文档中

希望对您有所帮助!

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
                    )
                )
            )
        )
    )
)