VMWare の vcloud REST API を使用して NIC を追加する powershell コマンドレットを作成しようとしています (VMWare 独自の powerCLI では許可されていないようです)。そのためには、次の XML を取得する必要があります。
<?xml version="1.0" encoding="UTF-8"?><vcloud:RasdItemsList
xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData"
xmlns:vcloud="http://www.vmware.com/vcloud/v1.5"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
href="https://vcloud.example.com/api/vApp/vm-89c84bd6-c6f2-4e4c-8a7d-c44a3489e2e4/virtualHardwareSection/networkCards"
type="application/vnd.vmware.vcloud.rasdItemsList+xml">
<vcloud:Link
href="https://vcloud.example.com/api/vApp/vm-89c84bd6-c6f2-4e4c-8a7d-c44a3489e2e4/virtualHardwareSection/networkCards"
rel="edit"
type="application/vnd.vmware.vcloud.rasdItemsList+xml"/>
</vcloud:RasdItemsList>
そして、最後の vcloud:Link の下に次の要素を追加します。
<ovf:Item>
<rasd:Address></rasd:Address>
<rasd:AddressOnParent>0</rasd:AddressOnParent>
<rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
<rasd:Connection
vcloud:ipAddressingMode="none"
vcloud:primaryNetworkConnection="true">VM Network</rasd:Connection>
<rasd:Description>E1000 ethernet adapter on "VM Network"</rasd:Description>
<rasd:ElementName>Network adapter 0</rasd:ElementName>
<rasd:InstanceID>1</rasd:InstanceID>
<rasd:ResourceSubType>E1000</rasd:ResourceSubType>
<rasd:ResourceType>10</rasd:ResourceType>
</ovf:Item>
これで、元の XML が $xmlDoc として PS に取り込まれ、以下のコードを試しました。
$xmlElt = $xmlDoc.CreateElement("ovf:Item")
$xmlSubElt = $xmlDoc.CreateElement("rasd:Address")
$xmlElt.AppendChild($xmlSubElt)
$xmlSubElt = $xmlDoc.CreateElement("rasd:AddressOnParent")
$xmlSubText = $xmlDoc.CreateTextNode("0")
$xmlSubElt.AppendChild($xmlSubText)
$xmlElt.AppendChild($xmlSubElt)
$xmlSubElt = $xmlDoc.CreateElement("rasd:AutomaticAllocation")
$xmlSubText = $xmlDoc.CreateTextNode("false")
$xmlSubElt.AppendChild($xmlSubText)
$xmlElt.AppendChild($xmlSubElt)
$xmlSubElt = $xmlDoc.CreateElement("rasd:Connection")
$xmlSubText = $xmlDoc.CreateTextNode("none")
$xmlSubElt.AppendChild($xmlSubText)
$xmlAtt = $xmlDoc.CreateAttribute("vcloud:primaryNetworkConnection")
$xmlAtt.Value = "True"
$xmlSubElt.Attributes.Append($xmlAtt)
$xmlAtt = $xmlDoc.CreateAttribute("vcloud:ipAddressingMode")
$xmlAtt.Value = "NONE"
$xmlSubElt.Attributes.Append($xmlAtt)
$xmlElt.AppendChild($xmlSubElt)
$xmlSubElt = $xmlDoc.CreateElement("rasd:Description")
$xmlSubText = $xmlDoc.CreateTextNode("Network Adapter 0")
$xmlSubElt.AppendChild($xmlSubText)
$xmlElt.AppendChild($xmlSubElt)
$xmlSubElt = $xmlDoc.CreateElement("rasd:ElementName")
$xmlSubText = $xmlDoc.CreateTextNode("Network Adapter 0")
$xmlSubElt.AppendChild($xmlSubText)
$xmlElt.AppendChild($xmlSubElt)
$xmlSubElt = $xmlDoc.CreateElement("rasd:InstanceID")
$xmlSubText = $xmlDoc.CreateTextNode("0")
$xmlSubElt.AppendChild($xmlSubText)
$xmlElt.AppendChild($xmlSubElt)
$xmlSubElt = $xmlDoc.CreateElement("rasd:ResourceSubType")
$xmlSubText = $xmlDoc.CreateTextNode("E1000")
$xmlSubElt.AppendChild($xmlSubText)
$xmlElt.AppendChild($xmlSubElt)
$xmlSubElt = $xmlDoc.CreateElement("rasd:ResourceType")
$xmlSubText = $xmlDoc.CreateTextNode("10")
$xmlSubElt.AppendChild($xmlSubText)
$xmlElt.AppendChild($xmlSubElt)
$xmlDoc.LastChild.AppendChild($xmlElt);
ただし、これが作成する XML の関連部分は次のとおりです。
<Item>
<Address />
<AddressOnParent>0</AddressOnParent>
<AutomaticAllocation>false</AutomaticAllocation>
<Connection primaryNetworkConnection="True" ipAddressingMode="NONE">none</Connection>
<Description>Network Adapter 0</Description>
<ElementName>Network Adapter 0</ElementName>
<InstanceID>0</InstanceID>
<ResourceSubType>E1000</ResourceSubType>
<ResourceType>10</ResourceType>
</Item>
ご覧のとおり、ほとんどの場合は機能しますが、残念ながら XML 名前空間のプレフィックスが削除されているようです。それでもうまくいくかもしれませんが、フォーマットを一致させたいと思っています。私は XML と Powershell の相互作用にかなり慣れていないので、質問は次のとおりです。
- 名前空間を出力するにはどうすればよいですか?
- 私がばかげて見落としているこのような各要素を手動で作成する簡単な方法はありますか?