从wsusscn2.cab读取package.xml文件的XML内容

时间:2016-10-12 17:14:24

标签: xml powershell

我正在尝试从wsussncn2.cab中读取package.xml文件的内容,该文件包含Microsoft的修补程序/修补程序列表,以便搜索Windows 2008R2和2012 R2产品的所有可用文件。 我从wsusscn2.cab中提取文件。文件Package.xml非常大,但似乎我能够使用PowerShell阅读。编辑等其他程序也会失败。

从PowerShell我使用这样的代码来执行一些搜索:

[xml]$xdoc = gc .\package.xml
$xdoc | Select-Xml "//OfflineSyncPackage"

$xdoc | Select-Xml "//Updates"

或任何其他类别,它什么都不返回。

但是当我使用时:

$xdoc.SelectNodes("/*/*/*")

然后我能够从中获取信息,如果我访问它,如果它是一个对象:

$xdoc.OfflineSyncPackage.Updates.update.Categories.Category

你知道为什么我不能使用Select-Xml或为什么我应该在SelectNodes()中选择'*'来全部?

如何对此文件执行XML搜索?

1 个答案:

答案 0 :(得分:1)

XML使用名称空间:

<?xml version="1.0" encoding="utf-8"?>
<OfflineSyncPackage MinimumClientVersion="5.8.0.2678"
    ProtocolVersion="1.0"
    PackageId="f27201b9-eca7-43ee-aed8-f7a2cddfec8b"
    SourceId="cc56dcba-9026-4399-8535-7a3c9bed7086"
    CreationDate="2016-10-10T22:40:27Z"
    PackageVersion="1.1"
    xmlns="http://schemas.microsoft.com/msus/2004/02/OfflineSync">
  <Updates>
    ...
  </Updates>
</OfflineSyncPackage>

所以你需要一个命名空间管理器来处理它们,如下所示:

[xml]$xdoc = gc .\package.xml

$nsm = New-Object Xml.XmlNamespaceManager($xdoc.NameTable)
$nsm.AddNamespace('ns', $xdoc.DocumentElement.NamespaceURI)

$xdoc.SelectNodes('//ns:Updates', $nsm)

或者像这样:

[xml]$xdoc = gc .\package.xml
$ns = @{ns='http://schemas.microsoft.com/msus/2004/02/OfflineSync'}

Select-Xml -Xml $xdoc -Namespace $ns -XPath '//ns:Updates'