zoukankan      html  css  js  c++  java
  • PowerShell技巧:使用XPath语法查询XML文件

    【TechTarget中国原创】

    XML是存储结构化数据的一个很好的途径,但是想要让数据在其中发挥作用又会有些困难。每一种语言都有其特定方式来查询XML文件中的命名空间、元素及属性。PowerShell也不例外。PowerShell在查询XML文件时会略有不同,而该技巧主要依赖于Select-Xml命令和XPath语法上。

    XPath是定义XML文件组成的语言。XPath早在1999年就已经存在,一直被用于查询XML文件最标准的方法。

    XPath将XML文件定义为树。XML文件中的每个节点都节点与其他各节点存在交互关系,就这样形成了一个族谱。如果其中一个节点包含许多其他节点,那 么该节点便是族谱中的“父母亲”,而其他节点便是族谱中的“孩子”。同样的道理,子节点之间是“兄弟姐妹”的关系。我们以这种方式来分解节点是要让大家更 容易理解XML文件结构。

    例如,XML文件中包含了车载经销商库存明细,具体代码看起来是这样的:

    <?xml version="1.0" encoding="utf-8"?>
    <dealership>
         <cars>
               <car make="Ford" model="Taurus" year="2014">
                    <trims>
                         <trimpackage>SportEdition</trimpackage>
                         <trimpackage>Basic</trimpackage>
                    </trims>
               </car>
               <car make="BMW" model="328i" year="2015">
                    <trims>
                         <trimpackage>SportEdition</trimpackage>
                         <trimpackage>Basic</trimpackage>
                    </trims>
               </car>
         </cars>
    </dealership>

    这段XML文件代表了经销商。经销商是一个节点,而经销商“内部”是一个代表车载库存的节点。经销商是车载节点的“父母亲”,而车载节点是“孩子”。然 后,车载节点下面也有分支,产生“孩子”节点。每个车载节点之间又形成一个“兄弟姐妹”关系。在这个例子中,存在树多属性关系。属性使特定节点的固有特 性。你会注意到,每个车载都有自己的标志和模型属性。这种做法可以使车载类型更加具体化。这些都是指定车载节点的属性。

    如何使用XPath查询XML

    以上时XML结构,但是,如何使用XPath 语言查询该结构呢?XPath是一种功能强大,但却十分复杂的查询语法。为了实现简化操作,接下来我们一起 谈谈XPath的普遍用法以及试图查找出此文件中所有车载节点。XPath提供了多种查找XML文件信息的方法。使用哪种方法主要根据你想要得到哪种效 果。以我们团队为例,我们拥有经销商总节点,其中包含许多车载子节点,而车载节点又包含许多子节点。用XPath语法就可以表达出这种族谱关系:

    /dealership/cars/car

    通过这种特殊的查询方法可以获取所有车载子节点,属于经销商节点分支,而这些经销商节点又属于XML文件根目录。这是一种与众不同的方法。然而,还有另外 集中查找车载节点的方法。如果你不希望了解整个方法原理,那么,你只需要需要输入查询//car就可以找到XML文件中所有车载节点。这种方法没有什么特 别之处,但是,当我们需要的时候还是会用到几次的。

    使用Select-Xml命令

    现在,我们一起分析下PowerShell的特别之处,并指出Select-Xml的工作原理。Select-Xml是一种PowerShell命令,并 用于查询System.Xml.XmlDocument对象。该命令会有一个“拍档”叫做Xpath,被用于说明特定XmlDocument对象的 XPath字符串。让我们一起看看实例。

    首先,为了能够使用上Select-Xml,我们必须有可供查询的XmlDocument对象。仅仅需要读取现有不工作电脑中的XML文件夹。然后,我们 需要从系统文件中读取XML文件,并将其转换到XmlDocument对象中。使用Get-Content命令读取XML文件夹中的纯文本文件,并将其转 换为变量,如图1所示

    图1. 使用Get-Content命令从文件夹系统中读取XML文件

    图1. 使用Get-Content命令从文件夹系统中读取XML文件

    运行该命令后,你将会看到BaseType数组,但是还没有发挥作用。因为它必须是XmlDocument形式。为了将xmlContent变量转换为 XmlDocument对象,我们还需将该变量转化为不同对象类型。做到以上几点后,再使用xml类型加速器,如图2所示。

    图2. 使用xml类型加速器将BaseType数列转换为XmlDocument

    图2. 使用xml类型加速器将BaseType数列转换为XmlDocument

    现在,你可以看到$xmlContents归为XmlDocument类。我们现在已经做好使用Select-Xml的准备了。

    使用Select-Xml的最佳方式是,通过管道将XML文件传递过去,并使用XPath作为参数,如图3所示。

    图3. 使用Select-Xml和XPath参数读取XML文件

    图3. 使用Select-Xml和XPath参数读取XML文件

    早期,我曾使用过相同的XPath查询方法,并返回到两个车载节点上,这正是我所期待的。我也可以使用 //car捷径得到同样的结果。

    查找更深层的节点

    如果你想要进一步了解车载详细信息怎么办?你需要展开每个节点。使用Select-Object命令,亦或者只需选择一些其他命令,然后,通过 ExpandProperty来实现查询功能,如图4所示。这种方法需要读取每个节点,并且需要读取每个节点所包含的具体节点有哪些。

    图4. 使用ExpandProperty参数展开节点

    图4. 使用ExpandProperty参数展开节点

    假设,你只需要了解Ford Taurus的具体信息的话该怎么办?因为"Ford"和"Taurus"是XML属性,所以,XPath方法会使之变得更加复杂:

    $xmlContents | Select-Xml -XPath "//car[@make='Ford']" | select -ExpandProperty node

    我在XPath语法中增加了@make='Ford'字符串。这是一种查询XML属性的方法。记住这个语法,将有助于理解替换"attribute"符号。

    更多XPath信息

    如果你想要了解更多有关XPath语法的信息,我建议你访问XPath tutorial on W3schools.com网站。而如果你想要了解更多关于Select-Xml命令的信息,推荐Petri.com上的题为Search XML Files with PowerShell using Select-Xml的文章。

  • 相关阅读:
    rpm命令之查询是否安装、包详细信息、包安装位置、文件属于哪个包、包依赖
    二进制包之rpm命令方式,安装、更新、卸载、依赖
    vmware之主机/桥接/NAT连接网络、xshell、xftf
    last、lastlog、traceroute、netstat
    ping、防火墙、ifconfig、setup、nmtui、write、wall、mail
    zip、gz、bz2、tar.gz、tar.bz2、jar、unar
    linux 用户管理 groupadd、groupmod、groupdel、gpasswd
    usermod、chage、userdel、su
    useradd、passwd、who、whoami、id、w及用户默认值文件
    文件passwd/shadow/grop/gshadow、邮箱目录、模板目录
  • 原文地址:https://www.cnblogs.com/liangwang/p/5147181.html
Copyright © 2011-2022 走看看