PowerShell 操作 xml

PowerShell作为优秀的服务器管理脚本,操作文件的能力还是非常出色的。XML文件作为最为常见的的系统配置文件,PowerShell 对于 xml 文件操作的支持也是非常强大的。PowerShell 如果希望将 xml 仅仅作为普通的文档处理,只需要使用 Get-Content 命令即可,但是如果系统将 xml 文件作为 xml 来处理(使用操作 xml)的方法,那么我们就需要使用 Get-Content,并且需要将获取内容强制转化为 xml 类型。

这是按照普通文档类型输出的情况。

<span style="font-family:微软雅黑;">Windows PowerShell
版权所有 (C) 2009 Microsoft Corporation。保留所有权利。

PS C:\Users\gablet> Get-Content "D:\PowerShell\Books.xml"
<?xml version="1.0" encoding="ISO-8859-1"?>
<Books>
  <Book year="2011" press="CN">C#</Book>
  <Book year="2012" press="EN">Java</Book>
</Books>
PS C:\</span><span style="font-family:微软雅黑;">Users\gablet></span>

如果是按照XML来获取效果如下:

PS C:\Users\gablet> [Xml]$XmlContent = Get-Content "D:\PowerShell\Books.xml"
PS C:\Users\gablet> [Xml]$XmlContent

xml                                                         Books
---                                                         -----
version="1.0" encoding="ISO-8859-1"                         Books


PS C:\Users\gablet>

这时候我们发现,我们得到的是一个xml对象,我们可以访问节点的值。

PS C:\Users\gablet> $XmlContent.Books

Book
----
{Book,Book}


PS C:\Users\gablet> $XmlContent.Books.Book[0]

year                                    press                                   #text
----                                    -----                                   -----
2011                                    CN                                      C#


PS C:\Users\gablet> $XmlContent.Books.Book[1]

year                                    press                                   #text
----                                    -----                                   -----
2012                                    EN                                      Java


PS C:\Users\gablet> $XmlContent.Books.Book[0].year
2011
PS C:\Users\gablet> $XmlContent.Books.Book[0].press
CN
PS C:\Users\gablet>

怎么样,确实很方便吧?

我们可以直接更新节点的值,示例如下:

PS C:\Users\gablet> $XmlContent.Books.Book[0].year = "2014"
PS C:\Users\gablet> $XmlContent.Books.Book[0].year
2014
PS C:\Users\gablet> $XmlContent.save("D:\PowerShell\Books.xml")
PS C:\Users\gablet> [Xml]$XmlContent = Get-Content "D:\PowerShell\Books.xml"
PS C:\Users\gablet> $XmlContent.Books.Book[0]

year                                    press                                   #text
----                                    -----                                   -----
2014                                    CN                                      C#


PS C:\Users\gablet>

注意,我们读取之后,xml文件存在于内存中,如果不执行方法,不会写入物理文件中。

上述操作xml文件方法存在一个缺陷,就是节点的位置不能改变,因为我们是通过节点的位置去更新的,有没有一种不依赖于位置的方法呢?这种方法是存在的。

PS C:\Users\gablet> $XmlContent.Books.Book | Where-Object { $_.year -eq "2014"}

year                                    press                                   #text
----                                    -----                                   -----
2014                                    CN                                      C#


PS C:\Users\gablet>

使用PowerShell 的 Where-Object 实现查找,我们可以进一步使用管道特性,更新这个节点,这里不再赘述。

除了这种方法以外,PowerShell 操作 xml 支持 查询某个路径下的节点。

PS C:\Users\gablet> $XmlContent.SelectNodes("Books/Book")

year                                    press                                   #text
----                                    -----                                   -----
2014                                    CN                                      C#
2012                                    EN                                      Java


PS C:\Users\gablet>

同样支持根据位置索引来获取节点

PS C:\Users\gablet> $XmlContent.SelectNodes("Books/Book[0]")
PS C:\Users\gablet> $XmlContent.SelectNodes("Books/Book[1]")

year                                    press                                   #text
----                                    -----                                   -----
2014                                    CN                                      C#


PS C:\Users\gablet> $XmlContent.SelectNodes("Books/Book[2]")

year                                    press                                   #text
----                                    -----                                   -----
2012                                    EN                                      Java


PS C:\Users\gablet>

注意:这里索引是从1开始的,不是0

还可以获取最后,最开始一个

PS C:\Users\gablet> $XmlContent.SelectNodes("Books/Book[last()]")

year                                    press                                   #text
----                                    -----                                   -----
2012                                    EN                                      Java

本章节就介绍到这里,期待继续...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇