Powershell,xml和xmlrpc

时间:2018-06-05 12:50:12

标签: xml powershell xml-rpc

所以,我正在写一个脚本来做一些简单的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>

2 个答案:

答案 0 :(得分:0)

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

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

希望这有帮助!

答案 1 :(得分:0)

带有一些辅助函数的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
                    )
                )
            )
        )
    )
)