XML을 PSObject로 변환
참고: 사용하고 있습니다.ConvertTo-XML
사용할 수 없습니다.Export-Clixml
:
나는 단순한 것을 만듭니다.PSObjec
t:
$a = New-Object PSObject -Property @{
Name='New'
Server = $null
Database = $null
UserName = $null
Password = $null
}
그런 다음에 XML로 변환합니다.ConvertTo-XML
:
$b = $a | Convertto-XML -NoTypeInformation
XML은 다음과 같습니다.
<?xml version="1.0"?>
<Objects>
<Object>
<Property Name="Password" />
<Property Name="Name">New</Property>
<Property Name="Server" />
<Property Name="UserName" />
<Property Name="Database" />
</Object>
</Objects>
속성/요소를 추출하고 변환하기 위해 점 표기법이나 XPath 쿼리를 파악하는 데 어려움을 겪고 있습니다.$b
원래대로PSObject
.
XPath를 사용하면 이 작업을 쉽게 수행할 수 있습니다.일반적으로 PowerShell을 사용하면 XML 작업이 매우 간단하지만, 이 경우에는 PowerShell 구문을 엄격히 사용하는 형식이 상당히 역겹다고 생각합니다.
filter XmlProperty([String]$Property) {
$_.SelectSingleNode("/Objects/Object/Property[@Name='$Property']").InnerText
}
$Name = $b | Xmlproperty Name
$Server = $b | XmlProperty Server
# etc...
편집: 일반적으로 개체 요소가 하나 이상 포함된 XML 문서에 대해 다음과 같은 작업을 수행할 수 있습니다.
function ConvertFrom-Xml($XML) {
foreach ($Object in @($XML.Objects.Object)) {
$PSObject = New-Object PSObject
foreach ($Property in @($Object.Property)) {
$PSObject | Add-Member NoteProperty $Property.Name $Property.InnerText
}
$PSObject
}
}
ConvertFrom-Xml $b
깊이가 무한한 나의 변종.
예를 참조.
function ConvertFrom-Xml {
<#
.SYNOPSIS
Converts XML object to PSObject representation for further ConvertTo-Json transformation
.EXAMPLE
# JSON->XML
$xml = ConvertTo-Xml (get-content 1.json | ConvertFrom-Json) -Depth 4 -NoTypeInformation -as String
.EXAMPLE
# XML->JSON
ConvertFrom-Xml ([xml]($xml)).Objects.Object | ConvertTo-Json
#>
param([System.Xml.XmlElement]$Object)
if (($Object -ne $null) -and ($Object.Property -ne $null)) {
$PSObject = New-Object PSObject
foreach ($Property in @($Object.Property)) {
if ($Property.Property.Name -like 'Property') {
$PSObject | Add-Member NoteProperty $Property.Name ($Property.Property | % {ConvertFrom-Xml $_})
} else {
if ($Property.'#text' -ne $null) {
$PSObject | Add-Member NoteProperty $Property.Name $Property.'#text'
} else {
if ($Property.Name -ne $null) {
$PSObject | Add-Member NoteProperty $Property.Name (ConvertFrom-Xml $Property)
}
}
}
}
$PSObject
}
}
저는 보통 xml을 해시 테이블로 파싱하지만 여기서 잡은 변환 함수를 사용하여 pscustom 객체로 변환하는 함수를 적용했습니다.
function xmlNodeToPsCustomObject ($node){
$hash = @{}
foreach($attribute in $node.attributes){
$hash.$($attribute.name) = $attribute.Value
}
$childNodesList = ($node.childnodes | ?{$_ -ne $null}).LocalName
foreach($childnode in ($node.childnodes | ?{$_ -ne $null})){
if(($childNodesList | ?{$_ -eq $childnode.LocalName}).count -gt 1){
if(!($hash.$($childnode.LocalName))){
$hash.$($childnode.LocalName) += @()
}
if ($childnode.'#text' -ne $null) {
$hash.$($childnode.LocalName) += $childnode.'#text'
}
$hash.$($childnode.LocalName) += xmlNodeToPsCustomObject($childnode)
}else{
if ($childnode.'#text' -ne $null) {
$hash.$($childnode.LocalName) = $childnode.'#text'
}else{
$hash.$($childnode.LocalName) = xmlNodeToPsCustomObject($childnode)
}
}
}
return $hash | ConvertTo-PsCustomObjectFromHashtable
}
function ConvertTo-PsCustomObjectFromHashtable {
param (
[Parameter(
Position = 0,
Mandatory = $true,
ValueFromPipeline = $true,
ValueFromPipelineByPropertyName = $true
)] [object[]]$hashtable
);
begin { $i = 0; }
process {
foreach ($myHashtable in $hashtable) {
if ($myHashtable.GetType().Name -eq 'hashtable') {
$output = New-Object -TypeName PsObject;
Add-Member -InputObject $output -MemberType ScriptMethod -Name AddNote -Value {
Add-Member -InputObject $this -MemberType NoteProperty -Name $args[0] -Value $args[1];
};
$myHashtable.Keys | Sort-Object | % {
$output.AddNote($_, $myHashtable.$_);
}
$output
} else {
Write-Warning "Index $i is not of type [hashtable]";
}
$i += 1;
}
}
}
언급URL : https://stackoverflow.com/questions/3242995/convert-xml-to-psobject
'programing' 카테고리의 다른 글
Git과 SSH, 어떤 키가 사용됩니까? (0) | 2023.10.21 |
---|---|
폴리머 1.0과 앵글 1.x 혼합 (0) | 2023.10.21 |
크론잡 아니면 MySQL 이벤트? (0) | 2023.10.21 |
ACE 에디터에서 가치를 얻으려면 어떻게 해야 합니까? (0) | 2023.10.21 |
상수 함수에 대한 포인터의 의미는 무엇입니까? (0) | 2023.10.21 |