【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文件

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

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

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

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

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

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

查找更深层的节点

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

图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的文章。

PowerShell技巧:使用XPath语法查询XML文件的更多相关文章

  1. .NET 使用 XPath 来读写 XML 文件

    XPath 是 XML 路径语言(XML Path Language),用来确定XML文档中某部分位置的语言.无论是什么语言什么框架,几乎都可以使用 XPath 来高效查询 XML 文件. 本文将介绍 ...

  2. 使用XPath对象解析xml文件

    使用XPath对象解析xml文件 1.DocumentBuilderFactory类  工厂API,使应用程序能从XML文档获取生成DOM对象树的解析器 其构造方法受保护,用newInstance() ...

  3. Dom4j使用Xpath语法读取xml节点

    我们可以使用Xpath的语法来轻易的读取xml的某个节点[类似于jQuery的选择器]: 使用Xpath语法需要添加新的jaxen-1.1-beta-7.rar 这个jar包 dom4j完整jar包我 ...

  4. 用DOM解析XML ,用xpath快速查询XML节点

    XPath是一种快速查询xml节点和属性的一种语言,Xpath和xml的关系就像是sql语句和数据库的关系.用sql语句可以从数据库中快速查询出东西同样的用xPath也可以快速的从xml中查询出东西. ...

  5. [libxml2]_[XML处理]_[使用libxml2的xpath特性修改xml文件内容]

    场景: 1.在软件需要保存一些配置项时,使用数据库的话比较复杂,查看内容也不容易.纯文本文件对utf8字符支持也不好. 2.这时候使用xml是最佳选择,使用跨平台库libxml2. 3.基于xpath ...

  6. XML 的 XPath 语法

    XPath 是 XML 路径语言(XML Path Language),用来确定XML文档中某部分位置的语言.无论是什么语言什么框架,几乎都可以使用 XPath 来高效查询 XML 文件. 本文将介绍 ...

  7. linux下使用libxml2实现对xml文件的读取及查询

    由于项目需要,这两天在用C++做XML文件解析的工作.在linux下有个很方便的操作xml文件的库——libxml2,它提供了一套创建和查询xml文件的C语言的接口.这篇博客主要介绍如何使用libxm ...

  8. Linq to XML操作XML文件

    LINQ的类型 在MSDN官方文件中,LINQ分为几种类型: . LINQ to Objects(或称LINQ to Collection),这是LINQ的基本功能,针对集合对象进行查询处理,包括基本 ...

  9. C#读取和写入XML文件

    关于xml是属于一个比较重要的东西,在平时开发的过程中,这块内容最主要的是要掌握XML内容的读取和写入操作. 一.什么是XML? XML 指可扩展标记语言(EXtensible Markup Lang ...

随机推荐

  1. 使用fn_dblog函数查看事务日志和恢复数据

    基本语法 SqlServer中有一个未在文档中公开的函数sys.fn_dblog,提供查询当前数据库事务日志的功能.通过这个函数,可以简单了解下数据库事务日志的机制 使用方法如下: select * ...

  2. 使用Excel调用ABAP系统的函数

    效果:在excel里创建一个按钮,开发一些VB script,可以连接指定的ABAP系统并执行系统里的ABAP function module. 在这里例子里执行ABAP系统的函数TH_USER_LI ...

  3. 有一个form,包含两个text,和两个按钮,当用户按第一个按扭时把数据提交到url1,按第二个按钮提交到url2,怎么实现呀?

    <form name="form1" method="post" action=""> <input type=" ...

  4. 最终类object 和内部类

    Object 类 性质:[1]是所有类的根类.             [2]如果一个类没有显示继承另外一个类,那么该类一定继承于Object toString() 返回对象的字符串表示形式 特殊:[ ...

  5. 2017.9.28 web设计简单的购物车应用案例--session的简单应用

    该购物过程是在session范围内完成的,需要使用session对象实现信息的共享 (1)购买“肉类”商品的页面 <%@ page language="java" impor ...

  6. open cv & vs

    原来基于vs和msdn一起读视频,结果发现现在的函数不能用了.找不到合适的解码器了,只好转战opencv. 具体怎么用,网上查吧,不过opencv读视频的例子,可以见这个. http://blog.c ...

  7. 记一次EBS正式环境补丁安装的过程

    因菏泽能源上线需求,需要在8009上修复集团8000环境上已经修复的所有补丁程序,修复前做应用及数据库层备份,完成修复后解决并发管理器无法启动的问题.此为概述. 应用层备份 应用层的备份采用直接压缩备 ...

  8. iOS中 XMPP即时通讯实现的主要步骤

    这里只是列出实现的只要步骤,不是全部代码. 首先导入XMPPFramework,及相关配置,完成后开始. 创建一个XMPPHelper  类来管理要进行的操作. XMPPHelper.h文件如下 ty ...

  9. 谷歌angle库使用心得

    通过谷歌的angle库可以在项目中,调用opengl接口渲染时,选择调用directx或者webgl来渲染,避免机器没有安装opengl驱动启动异常的问题. 这个库的使用可以不修改原有使用opengl ...

  10. JS-输入数字输出大写中文

    function(n) { var fraction = ['角', '分']; var digit = [ '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', ...