私はこの構造を持つこのxmlファイルを持っています:
<?xml version="1.0" encoding="utf-8"?>
<company>
<category>
<category1 name="Office1">
<category2 name="Project1">
<category3 name="Test1"/>
<category3 name="Test2"/>
</category2>
<category2 name="Project2">
<category3 name="Test1"/>
<category3 name="Test2"/>
<category3 name="Test3"/>
</category2>
</category1>
<category1 name="Office2">
<category2 name="Project1">
<category3 name="Test1"/>
<category3 name="Test2"/>
</category2>
<category2 name="Project2">
<category3 name="Test1"/>
<category3 name="Test2"/>
<category3 name="Test3"/>
</category2>
</category1>
</category>
</company>
会社に行を追加したい->カテゴリ-> category1 "Office2"-> category2 "Project2"行は次のとおりです。
<category3 name="Test4"/>
私はこれを試しました:
$Path = "C:\file.xml"
$xml = [xml](get-content $Path)
$xml.Load($Path)
$test = $xml.company.category
$test.category1 *what to do here*
1つのサブエレメントでこれを行う方法、およびクローンと追加の方法を知っています。しかし、私はこれからどこから始めるべきかわかりません。
より短い方法があるかどうかはわかりませんが、これはうまくいくはずです:
$Path = "C:\file.xml"
$xml = [xml](get-content $Path)
$xml.Load($Path)
$target = (($xml.company.category.category1|where {$_.name -eq "Office2"}).category2|where {$_.name -eq "Project2"})
$addElem = $xml.CreateElement("Category3")
$addAtt = $xml.CreateAttribute("name")
$addAtt.Value = "Test4"
$addElem.Attributes.Append($addAtt)
$target.AppendChild($addElem)
$xml.Save("C:\file1.xml")
ここでの主なポイントは、where
を使用して、指定された属性値を持つ要素を取得し、新しい要素と新しい属性を作成することです。
「ターゲット」要素を取得する別の可能な解決策は、XPathの使用です。
$target = $xml.SelectSingleNode('//company/category/category1[@name="Office2"]/category2[@name="Project2"]')
[XML]$XML=gc "C:\file.xml"
xmlをロードする簡単な方法です