使用带有XPATH的vb.net读取XML属性

时间:2014-05-12 09:15:52

标签: xml vb.net xpath xmldocument

我试图创建一个读取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

请帮助..它让我完全疯了..

2 个答案:

答案 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