1

本体として Web サービスに送り返す必要がある XML を PowerShell で操作するのに本当に苦労しています。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
4

2 に答える 2