我试图创建一个读取appv清单文件属性的应用程序。我使用vb.net 2012作为应用程序。
我想阅读该属性:' VersionId'和' PackageId'使用xpath从manifest文件中,但我无法理解XPATH的工作方式。
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns:appv1.1="http://schemas.microsoft.com/appv/2013/manifest" xmlns:appv="http://schemas.microsoft.com/appv/2010/manifest" xmlns="http://schemas.microsoft.com/appx/2010/manifest" appv:IgnorableNamespaces="appv1.1" IgnorableNamespaces="appv appv1.1">
<Identity appv:VersionId="79cdb3a0-8f7d-416d-828e-003fe3125eb2" appv:PackageId="64ce44eb-5255-4514-bb74-e14ae393ae9a" Version="0.0.0.4" Publisher="CN=Reserved" Name="Reserved"/>
这就是我现在所拥有的:
Dim xml As New XmlDocument
xml.Load(xmlFileName)
Dim nsmgr As New XmlNamespaceManager(xml.NameTable)
nsmgr.AddNamespace("appv", "http://schemas.microsoft.com/appv/2010/manifest")
PackageID = xml.SelectSingleNode("//Package/Identity[@name='appv:PackageId']", nsmgr).InnerText
VersionID = xml.SelectSingleNode("//Package/Identity[@name='appv:VersionId']'", nsmgr).InnerText
请帮助..它让我完全疯了..
答案 0 :(得分:1)
默认命名空间不为空,因此您必须为XPath表达式中的默认命名空间定义和使用显式命名空间前缀。例如:
Dim xml As New XmlDocument
xml.Load(xmlFileName)
Dim nsmgr As New XmlNamespaceManager(xml.NameTable)
nsmgr.AddNamespace("appv", "http://schemas.microsoft.com/appv/2010/manifest")
nsmgr.AddNamespace("appx", "http://schemas.microsoft.com/appx/2010/manifest")
PackageID = xml.SelectSingleNode("//appx:Package/appx:Identity[@name='appv:PackageId']", nsmgr).InnerText
VersionID = xml.SelectSingleNode("//appx:Package/appx:Identity[@name='appv:VersionId']'", nsmgr).InnerText
换句话说,XML文档中缺少名称空间前缀意味着&#34;默认名称空间&#34;,而XPath查询中缺少名称空间前缀意味着&#34;空白名称空间& #34;
答案 1 :(得分:1)
有几个问题(并且还假设您已经剪掉Xml
样本,因为元素不会关闭)
Package
(以及Identity
)位于xmlns
"http://schemas.microsoft.com/appx/2010/manifest"
中 - 您需要另一个名称空间。
nsmgr.AddNamespace("def", "http://schemas.microsoft.com/appx/2010/manifest")
此外,您的属性xpath看起来不正确。像这样刮取属性的值:
PackageID = xml.SelectSingleNode("//def:Package/def:Identity/@appv:PackageId",
nsmgr).Value
PackageID = xml.SelectSingleNode("//def:Package/def:Identity/@appv:VersionId",
nsmgr).Value