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