我真的很努力地操縱PowerShell中的一些XML,我需要將它作爲一個主體發送回Web服務。任何人都可以幫助我得到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)
...下面從安斯加爾的意見,這是我在使用一個命名空間的嘗試。(破)
[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
「想不工作」 是不夠的問題說明。你究竟試過了什麼?那次嘗試的結果究竟是什麼? –
當然,我會在編輯中添加上面的內容,我不想發佈大量問題,所以很抱歉,我最終放棄了這一部分。 –