XML 하위 요소 추가
PowerShell을 사용하여 XML 트리에 여러 하위 요소를 추가하고자 합니다.
하나의 요소를 추가하는 것은 알고, 하나 또는 여러 개의 속성을 추가하는 것은 알고 있지만, 여러 개의 요소를 추가하는 방법은 이해할 수 없습니다.
하위 XML 트리를 텍스트로 쓰는 것도 한 가지 방법입니다.
하지만 한 번에 요소가 추가되지 않아서 이 방법을 사용할 수 없습니다.
한 가지 요소를 추가하려면 다음과 같이 합니다.
[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
]
질문:하위 요소를 한 번에 하나씩 추가하려면 어떻게 해야 합니까?
다음 예를 살펴봅니다.
# 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")
편집됨
비고 : 저장에서 상대 경로를 사용하면 원하는 대로 사용할 수 없습니다.
저는 API를 이용하여 노드별로 구성하는 대신, 손으로 xml을 만드는 것을 선호합니다. iho는 손으로 훨씬 더 가독성이 높고 mainable이 될 것이기 때문입니다.
다음은 예입니다.
$pathToConfig = $env:windir + "\Microsoft.NET\Framework64\v4.0.30319\Config\web.config"
$xml = [xml] (type $pathToConfig)
[xml]$appSettingsXml = @"
<appSettings>
<add key="WebMachineIdentifier" value="$webIdentifier" />
</appSettings>
"@
$xml.configuration.AppendChild($xml.ImportNode($appSettingsXml.appSettings, $true))
$xml.Save($pathToConfig)
이 코드 샘플을 확인합니다.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>
방문하시는 분들을 위해서요.
부모 문서에 네임스페이스가 있어서 문제가 있었습니다.ImportNode
빈 공간을 추가하고 있었습니다.xmnls=""
가져온 xml의 요소, 내 앱에 문제 발생
위의 답변에 따라 확장합니다.이 문제를 해결하려면 상위 문서에서 네임스페이스가 설정된 더미 노드에 래핑합니다.
$pathToConfig = $env:windir + "\Microsoft.NET\Framework64\v4.0.30319\Config\web.config"
$xml = [xml] (type $pathToConfig)
$root = $xml.get_DocumentElement()
$namespaceuri = $root.NamespaceURI
[xml]$appSettingsXml = @"
<Dummy xmlns="$namespaceuri">
<appSettings>
<add key="WebMachineIdentifier" value="$webIdentifier" />
</appSettings>
</Dummy>
"@
$xml.configuration.AppendChild($xml.ImportNode($appSettingsXml.Dummy.appSettings, $true))
$xml.Save($pathToConfig)
언급URL : https://stackoverflow.com/questions/10987318/adding-xml-sub-elements
'programing' 카테고리의 다른 글
MySQL Workbench 호환되지 않는/비표준 서버 (0) | 2023.11.02 |
---|---|
워드프레스의 양식을 사용하여 파일 업로드 (0) | 2023.11.02 |
FALSE와 TRUE의 이상한 정의, 왜? (0) | 2023.11.02 |
왜 C 언어들은 if 문장에서 간단한 조건 주위에 부모를 필요로 합니까? (0) | 2023.11.02 |
Java Config를 사용한 Spring Security 사용자 지정 인증 필터 (0) | 2023.11.02 |