31

PowerShell を使用して、いくつかのサブ要素を XML ツリーに追加したいと考えています。
1 つの要素を追加する方法、1 つまたは複数の属性を追加する方法は知っていますが、複数の要素を追加する方法がわかりません。

サブ XML ツリーをテキストとして記述する方法
もありますが、要素が一度に追加されないため、この方法は使用できません。

1 つの要素を追加するには、次のようにします。

[xml]$xml = get-content $nomfichier
$newEl = $xml.CreateElement('my_element')
[void]$xml.root.AppendChild($newEl)

正常に動作します。これにより、次の XML ツリーが得られます。

$xml | fc
class XmlDocument
{
  root =
    class XmlElement
    {
      datas =
        class XmlElement
        {
          array1 =
            [
              value1
              value2
              value3
            ]
        }
      my_element =     <-- the element I just added
    }
}

次に、「my_element」にサブ要素を追加します。私は同様の方法を使用します:

$anotherEl = $xml.CreateElement('my_sub_element')
[void]$xml.root.my_element.AppendChild($anotherEl) <-- error because $xml.root.my_element is a string
[void]$newEl.AppendChild($anotherEl)               <-- ok
$again = $xml.CreateElement('another_one')
[void]$newEl.AppendChild($again)

これにより、次の XML ツリーが得られます (部分的に表示)。

my_element =
  class XmlElement
  {
    my_sub_element =
    another_one =
  }

これらは属性であり、サブ要素ではありません。
サブ要素は次のように表示されます。

my_element =
  [
    my_sub_element
    another_one
  ]

質問: 複数のサブ要素を 1 つずつ追加するにはどうすればよいですか?

4

4 に答える 4

46

次の例を見てください。

# Document creation
[xml]$xmlDoc = New-Object system.Xml.XmlDocument
$xmlDoc.LoadXml("<?xml version=`"1.0`" encoding=`"utf-8`"?><Racine></Racine>")

# Creation of a node and its text
$xmlElt = $xmlDoc.CreateElement("Machine")
$xmlText = $xmlDoc.CreateTextNode("Mach1")
$xmlElt.AppendChild($xmlText)

# Creation of a sub node
$xmlSubElt = $xmlDoc.CreateElement("Adapters")
$xmlSubText = $xmlDoc.CreateTextNode("Network")
$xmlSubElt.AppendChild($xmlSubText)
$xmlElt.AppendChild($xmlSubElt)

# Creation of an attribute in the principal node
$xmlAtt = $xmlDoc.CreateAttribute("IP")
$xmlAtt.Value = "128.200.1.1"
$xmlElt.Attributes.Append($xmlAtt)

# Add the node to the document
$xmlDoc.LastChild.AppendChild($xmlElt);

# Store to a file 
$xmlDoc.Save("c:\Temp\Temp\Fic.xml")

編集済み

備考:保存で相対パスを使用すると、期待どおりの結果が得られません

于 2012-06-12T06:34:16.517 に答える
5

このコードサンプルを確認してください。XML をゼロから作成するために必要なものがすべて含まれています。

function addElement($e1, $name2, $value2, $attr2)
{
    if ($e1.gettype().name -eq "XmlDocument") {$e2 = $e1.CreateElement($name2)}
    else {$e2 = $e1.ownerDocument.CreateElement($name2)}
    if ($attr2) {$e2.setAttribute($value2,$attr2)}
    elseif ($value2) {$e2.InnerText = "$value2"}
    return $e1.AppendChild($e2)
}

function formatXML([xml]$xml)
{
    $sb = New-Object System.Text.StringBuilder
    $sw = New-Object System.IO.StringWriter($sb)
    $wr = New-Object System.Xml.XmlTextWriter($sw)
    $wr.Formatting = [System.Xml.Formatting]::Indented
    $xml.Save($wr)
    return $sb.ToString()
}

...では、両方の関数を使用して、新しい XML オブジェクトを作成および表示してみましょう。

$xml = New-Object system.Xml.XmlDocument
$xml1 = addElement $xml "a"
$xml2 = addElement $xml1 "b"
$xml3 = addElement $xml2 "c" "value"
$xml3 = addElement $xml2 "d" "attrib" "attrib_value"

write-host `nFormatted XML:`r`n`n(formatXML $xml.OuterXml)

結果は次のようになります。

Formatted XML:

 <?xml version="1.0" encoding="utf-16"?>
<a>
  <b>
    <c>value</c>
    <d attrib="attrib_value" />
  </b>
</a>
于 2015-09-13T08:13:16.233 に答える