我正在尝试从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搜索?
答案 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'