Powershell, xml и xmlrpc - PullRequest
       9

Powershell, xml и xmlrpc

0 голосов
/ 05 июня 2018

Итак, я пишу скрипт для выполнения простых запросов xmlrpc.Насколько я могу судить, в Powershell ничего встроенного нет, поэтому лучшее и простое решение, которое я нашел, - это просто создать xml и опубликовать его с помощью invoke-webrequest или invoke-restmethod.

Есликто-то знает о лучшем способе использования готовых функций, не стесняйтесь обучать меня.

Теперь вот часть, с которой у меня возникли некоторые проблемы.Генерация XML.Как бы я хотел, чтобы это работало: создать собственный объект, добавить свойства, преобразовать в xml и опубликовать.Еще лучше было бы создать xml-объект, добавить узлы и свойства, а затем опубликовать его.

Хотя это кажется чем-то вроде PITA, и на данный момент я чувствую, что будет легче лечитьXML как строка в Powershell и редактируйте / управляйте таким образом.Итак, я что-то упустил или работаю с xml в Powershell не так просто, как я надеялся?

Редактировать: Чтобы уточнить, я прошу выбрать лучший инструмент / технику для создания собственного xml в Powershell.Пока что у меня сложилось впечатление, что лучший способ - это просто построить его как строку, так как использование встроенных инструментов 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 голосов
/ 07 июня 2018

XLinq с некоторыми вспомогательными функциями позволяет относительно легко создавать XML-документы в PowerShell.Например:

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
                    )
                )
            )
        )
    )
)
0 голосов
/ 05 июня 2018

Попробуйте построить что-нибудь подобное:

[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 в переменную, а не в строку.
  • Сначала построил дерево, затем добавил его в документ

Надеюсь, это поможет!

...