Я действительно пытаюсь манипулировать некоторыми XML в PowerShell, которые мне нужно отправить обратно в веб-службу как тело. Может ли кто-нибудь помочь мне получить XML, изложенным так, как это должно быть, пожалуйста?Вставить новый узел XML после другого узла
<?xml version="1.0" encoding="UTF-8"?>
<EdgeGateway>
<Configuration>
<GatewayInterfaces>
<GatewayInterface>
<InterfaceType>uplink</InterfaceType>
<SubnetParticipation>
<Gateway>1.2.3.4</Gateway>
<Netmask>255.255.255.240</Netmask>
<IpAddress>1.2.3.5</IpAddress>
# Missing the IpRange XML section - defined below
<UseForDefaultRoute>true</UseForDefaultRoute>
</SubnetParticipation>
<UseForDefaultRoute>true</UseForDefaultRoute>
</GatewayInterface>
</GatewayInterfaces>
</Configuration>
</EdgeGateway>
должно стать:
<?xml version="1.0" encoding="UTF-8"?>
<EdgeGateway>
<Configuration>
<GatewayInterfaces>
<GatewayInterface>
<InterfaceType>uplink</InterfaceType>
<SubnetParticipation>
<Gateway>1.2.3.4</Gateway>
<Netmask>255.255.255.240</Netmask>
<IpAddress>1.2.3.5</IpAddress>
# New Content added here
<IpRanges>
<IpRange>
<StartAddress>1.2.3.5</StartAddress>
<EndAddress>1.2.3.5</EndAddress>
<IpRange>
</IpRanges>
# End of new content
<UseForDefaultRoute>true</UseForDefaultRoute>
</SubnetParticipation>
<UseForDefaultRoute>true</UseForDefaultRoute>
</GatewayInterface>
</GatewayInterfaces>
</Configuration>
</EdgeGateway>
До сих пор я был в состоянии создать новые XML-узлов/Элементы для нового содержания, но я не могу его вставить в нужное место. Я могу получить метод AppendChild()
, но он помещает содержимое после раздела <UseForDefaultRoute>
- не раньше.
Я пытался сделать InsertBefore()
и InsertAfter()
, но он просто не хочет работать. Наконец, когда я применяю подход AppendChild()
, я также получаю немного дополнительного текста, которого я не ожидал, что-то о xmlns?
<IpRanges xmlns=""><IpRange><StartAddress>1.2.3.5</StartAddress><EndAddress>1.2.3.5</EndAddress></IpRange></IpRanges>
Это то, что мне удалось собрать, иметь в виду, что он сломан :(
# load XML file
[xml]$doc = $response
# create node <StartAddress>
$startNode = $doc.CreateNode('element', 'StartAddress', '')
$start = $doc.CreateTextNode('1.2.3.5')
$startNode.AppendChild($start) | Out-Null
# create node <EndAddress>
$endNode = $doc.CreateNode('element', 'EndAddress', '')
$end = $doc.CreateTextNode('1.2.3.5')
$endNode.AppendChild($end) | Out-Null
# create node <IpRange> and append child nodes <StartAddress> and <EndAddress>
$ipRange = $doc.CreateNode('element', 'IpRange', '')
$ipRange.AppendChild($startNode) | Out-Null
$ipRange.AppendChild($endNode) | Out-Null
# create node <IpRanges> and append child nodes <IpRange>
$ipRanges = $doc.CreateNode('element', 'IpRanges', '')
$ipRanges.AppendChild($ipRange) | Out-Null
# append node <IpRanges> to node <SubnetParticipation>
$subnetParticpation = $doc.EdgeGateway.Configuration.GatewayInterfaces.GatewayInterface[1].SubnetParticipation.AppendChild($ipRanges)
... следуя совету Ansgar, это моя попытка использования пространства имен. (Пунктирная)
[xml]$fragment = "<dummy xmlns:xsi='http://www.vmware.com/vcloud/v1.5'><IpRanges>$($ipRanges.InnerXml)</IpRanges></dummy>"
# $fragment.InnerXml ..returns..
# <dummy xmlns:xsi="http://www.vmware.com/vcloud/v1.5"><IpRanges><IpRange><StartAddress>185.39.247.98</StartAddress><EndAddress>185.39.247.98</EndAddress></IpRange></IpRanges></dummy>
# $body is the full XML Document I want to paste into
[xml]$xml = $body
$nsm = New-Object Xml.XmlNamespaceManager $xml.NameTable
$nsm.AddNamespace('xsi', $xml.NamespaceURI)
$node = $xml.ImportNode($fragment.DocumentElement.IpRanges, $true)
$subnetPart = $xml.SelectSingleNode("//IpAddress[text()='185.39.247.98']", $nsm)
$subnetPart
# returns nothing
"Не хочет работать" является недостаточным описание проблемы. Что именно вы пробовали? И каковы были результаты этой попытки? –
Несомненно, я добавлю это выше в редакциях, я не хочу публиковать массовый вопрос, так что извините, что я оставил эту часть. –