如何使用PowerShell从XML文件中获取属性值

egdjgwm8  于 12个月前  发布在  Shell
关注(0)|答案(2)|浏览(149)

我是一个初学者的powershell,如何使用PowerShell从XML文件中获取属性值。我的XML文件看起来像这样:

<?xml version="1.0"?>
-<Objs xmlns="http://schemas.microsoft.com/powershell/2004/04" Version="1.1.0.1">
  -<Obj RefId="0">
    -<Props>
      <S N="Name">Shares</S>
     <S N="Path">D:\Shares</S>
    </Props>

字符串
这就是我所尝试的:

$xml = [xml](Get-Content "C:SmbShares.xml")
$xml.Objs.Obj[0].Props.S.N.Name


这是预期的结果:

Shares


任何帮助都非常感谢!

kx1ctssn

kx1ctssn1#

我喜欢使用XmlLinq库。你有一个默认的命名空间,必须使用。

using assembly System.Xml.Linq

$filename = "c:\temp\test.xml"

$doc = [System.Xml.Linq.XDocument]::Load($filename)
$ns = $doc.Root.GetDefaultNamespace()
$s = $doc.Descendants($ns + 'S') 

$name = $s | Where-Object { $_.Attribute('N').Value -eq 'Name' }

Write-Host $name[0].Value

字符串

fsi0uk1n

fsi0uk1n2#

PowerShell对XML DOM的方便适应,即使用 * 点表示法 * 钻取XML文档的能力(有关背景信息,请参阅this answer),扩展到元素和属性 * 名称 *,但不是 * 值 *。
因此,必须在<S>目标元素上使用 filter 来查找N属性 value"Name"的元素:

$xml.Objs.Obj[0].Props.S.Where({ $_.N -eq 'Name'}).InnerText

字符串

  • 上面使用了内部的.Where()方法进行过滤。
  • 由于<S>元素具有 attributes,因此PowerShell不仅返回其内部文本;它还将其报告为System.Xml.XmlElement示例。因此,必须访问.InnerText属性。

相关问题