首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用XPath将XML转换为对象时出错

使用XPath将XML转换为对象时出错
EN

Stack Overflow用户
提问于 2020-08-06 17:00:53
回答 1查看 137关注 0票数 0

我正在与Powershell、XML和XPath进行斗争。

我想要一个脚本,它将读取一个文件,提取我需要的节点,并转换成一个我可以在脚本中使用的对象。

该文件如下所示:

代码语言:javascript
复制
<?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>

我写了这段代码:

代码语言:javascript
复制
$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

我本来希望能写到:

写-主机“文件夹是:$apps.Folder”-> C:\t1写-主机"Config is:$apps.Configs.N2“-> Yen

但是我无法得到一个对象,因为这个错误:

代码语言:javascript
复制
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

有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-06 17:25:28

这看起来像来自Export-CliXml的输出。使用Import-CliXml反序列化会更容易。

代码语言:javascript
复制
$apps = Import-Clixml -Path c:\file.xml
$apps.Set2.Folder
$apps.Set2.Configs.N2

在原始代码中,命名空间具有错误的语法。它应该是一个散列表。

代码语言:javascript
复制
$ns = @{ns='http://schemas.microsoft.com/powershell/2004/04'}

围绕在双引号中的哈希表代码将创建一个字符串。如果我们对包含ObjSet2节点使用XPATH表达式,则需要进一步挖掘节点树。

代码语言:javascript
复制
$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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63288455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档