Ошибки при преобразовании XML в объект с помощью XPath
Я борюсь с Powershell, XML и XPath.
Мне нужен сценарий, который будет читать файл, извлекать нужный мне узел и преобразовывать его в объект, который я могу использовать в сценарии.
Файл выглядит так:
<?xml version="1.0"?>
<Objs xmlns="http://schemas.microsoft.com/powershell/2004/04" Version="1.1.0.1">
<Obj RefId="0">
<TN RefId="0">
<T>System.Object</T>
</TN>
<Props>
<Obj N="Set1" RefId="1">
<TN RefId="1">
<T>System.Object</T>
</TN>
<Props>
<S N="Folder">C:\t1</S>
<Obj N="Configs" RefId="10">
<TN RefId="10">
<T>System.Object</T>
</TN>
<Props>
<S N="N1">Geralt</S>
<S N="N2">Ciri</S>
</Props>
</Obj>
</Props>
</Obj>
<Obj N="Set2" RefId="2">
<TN RefId="2">
<T>System.Object</T>
</TN>
<Props>
<S N="Folder">C:\t2</S>
<Obj N="Configs" RefId="20">
<TN RefId="20">
<T>System.Object</T>
</TN>
<Props>
<S N="N1">Triss</S>
<S N="N2">Yen</S>
</Props>
</Obj>
</Props>
</Obj>
</Props>
</Obj>
</Objs>
Я написал такой код:
$path = "c:\file.xml"
$xpath = "/ns:Objs/ns:Obj/ns:Props/ns:Obj[@N='Set2']"
$ns = "@{ns='http://schemas.microsoft.com/powershell/2004/04'}"
[xml]$apps = Select-Xml -Path $path -XPath $xpath -Namespace $ns
Я ожидал, что смогу написать:
Write-Host "Папка: $apps.Folder" -> C:\t1 Write-Host "Конфигурация: $apps.Configs.N2" -> Yen
Но я не могу получить объект из-за этой ошибки:
Cannot convert value "...". Error: "This document already has a 'DocumentElement' node."
At line:1 char:1
+ [xml]$t = Select-Xml -Path $path -XPath "/ns:Objs/ns:Obj/ns:Props/ns:Obj[@N='Set2']"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : MetadataError: (:) [], ArgumentTransformationMetadataException
+ FullyQualifiedErrorId : RuntimeException
Какие-либо предложения?
1 ответ
Это похоже на вывод из Export-CliXml
. Было бы проще десериализовать, используяImport-CliXml
:
$apps = Import-Clixml -Path c:\file.xml
$apps.Set2.Folder
$apps.Set2.Configs.N2
В исходном коде пространство имен имеет неправильный синтаксис. Это должна быть хеш-таблица.
$ns = @{ns='http://schemas.microsoft.com/powershell/2004/04'}
Вместо этого, заключая код хэш-таблицы в двойные кавычки, создается строка. Если мы используем ваше выражение XPATH дляObj
узел, содержащий Set2
, вам нужно будет продолжить детализацию дерева узлов.
$path = "c:\file.xml"
$xpath = "/ns:Objs/ns:Obj/ns:Props/ns:Obj[@N='Set2']"
$ns = @{ns='http://schemas.microsoft.com/powershell/2004/04'}
$apps = Select-Xml -Path $path -XPath $xpath -Namespace $ns
$apps.Node.Props.S.Innertext # Folder value
$apps.Node.Props.Obj.Props.S.Innertext # Configs values