PowerShell 操作 xml

前端之家收集整理的这篇文章主要介绍了PowerShell 操作 xml前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

  1. <span style="font-family:微软雅黑;">Windows PowerShell
  2. 版权所有 (C) 2009 Microsoft Corporation。保留所有权利。
  3.  
  4. PS C:\Users\gablet> Get-Content "D:\PowerShell\Books.xml"
  5. <?xml version="1.0" encoding="ISO-8859-1"?>
  6. <Books>
  7. <Book year="2011" press="CN">C#</Book>
  8. <Book year="2012" press="EN">Java</Book>
  9. </Books>
  10. PS C:\</span><span style="font-family:微软雅黑;">Users\gablet></span>

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

  1. PS C:\Users\gablet> [Xml]$XmlContent = Get-Content "D:\PowerShell\Books.xml"
  2. PS C:\Users\gablet> [Xml]$XmlContent
  3.  
  4. xml Books
  5. --- -----
  6. version="1.0" encoding="ISO-8859-1" Books
  7.  
  8.  
  9. PS C:\Users\gablet>

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

  1. PS C:\Users\gablet> $XmlContent.Books
  2.  
  3. Book
  4. ----
  5. {Book,Book}
  6.  
  7.  
  8. PS C:\Users\gablet> $XmlContent.Books.Book[0]
  9.  
  10. year press #text
  11. ---- ----- -----
  12. 2011 CN C#
  13.  
  14.  
  15. PS C:\Users\gablet> $XmlContent.Books.Book[1]
  16.  
  17. year press #text
  18. ---- ----- -----
  19. 2012 EN Java
  20.  
  21.  
  22. PS C:\Users\gablet> $XmlContent.Books.Book[0].year
  23. 2011
  24. PS C:\Users\gablet> $XmlContent.Books.Book[0].press
  25. CN
  26. PS C:\Users\gablet>

怎么样,确实很方便吧?

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

  1. PS C:\Users\gablet> $XmlContent.Books.Book[0].year = "2014"
  2. PS C:\Users\gablet> $XmlContent.Books.Book[0].year
  3. 2014
  4. PS C:\Users\gablet> $XmlContent.save("D:\PowerShell\Books.xml")
  5. PS C:\Users\gablet> [Xml]$XmlContent = Get-Content "D:\PowerShell\Books.xml"
  6. PS C:\Users\gablet> $XmlContent.Books.Book[0]
  7.  
  8. year press #text
  9. ---- ----- -----
  10. 2014 CN C#
  11.  
  12.  
  13. PS C:\Users\gablet>

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

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

  1. PS C:\Users\gablet> $XmlContent.Books.Book | Where-Object { $_.year -eq "2014"}
  2.  
  3. year press #text
  4. ---- ----- -----
  5. 2014 CN C#
  6.  
  7.  
  8. PS C:\Users\gablet>

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

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

  1. PS C:\Users\gablet> $XmlContent.SelectNodes("Books/Book")
  2.  
  3. year press #text
  4. ---- ----- -----
  5. 2014 CN C#
  6. 2012 EN Java
  7.  
  8.  
  9. PS C:\Users\gablet>

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

  1. PS C:\Users\gablet> $XmlContent.SelectNodes("Books/Book[0]")
  2. PS C:\Users\gablet> $XmlContent.SelectNodes("Books/Book[1]")
  3.  
  4. year press #text
  5. ---- ----- -----
  6. 2014 CN C#
  7.  
  8.  
  9. PS C:\Users\gablet> $XmlContent.SelectNodes("Books/Book[2]")
  10.  
  11. year press #text
  12. ---- ----- -----
  13. 2012 EN Java
  14.  
  15.  
  16. PS C:\Users\gablet>

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

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

  1. PS C:\Users\gablet> $XmlContent.SelectNodes("Books/Book[last()]")
  2.  
  3. year press #text
  4. ---- ----- -----
  5. 2012 EN Java

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

猜你在找的XML相关文章