当前位置:  开发笔记 > 编程语言 > 正文

带有命名空间的XPath选择节点

如何解决《带有命名空间的XPath选择节点》经验,为你挑选了3个好方法。

它是一个.vbproj,看起来像这样


    
        15a7ee82-9020-4fda-a7fb-85a61664692d

我想得到的只是ProjectGuid,但是当命名空间存在时它不起作用......

 Dim xmlDoc As New XmlDocument()
 Dim filePath As String = Path.Combine(mDirectory, name + "\" + name + ".vbproj")
 xmlDoc.Load(filePath)
 Dim value As Object = xmlDoc.SelectNodes("/Project/PropertyGroup/ProjectGuid")

我该怎么做才能解决这个问题?



1> annakata..:

我可能倾向于使用Bartek的*命名空间解决方案,但一般的xpath解决方案是:

//*[local-name()='ProjectGuid']

**自从Bartek的回答消失后,我推荐Teun(实际上更彻底)*


好的捕获,这是一个不要声明无聊和昂贵的命名空间的好方法

2> Teun D..:

这样做(IMHO)的最佳方法是创建命名空间管理器.这可以用于调用SelectNodes来指示哪些名称空间URL连接到哪些前缀.我通常设置一个静态属性,返回一个像这样的适当实例(它是C#,你必须翻译):

private static XmlNamespaceManager _nsMgr;
public static XmlNamespaceManager NsMgr
{
  get
  {
    if (_nsMgr == null)
    {
      _nsMgr = new XmlNamespaceManager(new NameTable());
      _nsMgr.AddNamespace("msb", "http://schemas.microsoft.com/developer/msbuild/2003");
    }
    return _nsMgr;
  }
}

我这里只包含一个命名空间,但你可以有多个命名空间.然后你可以从这样的文件中选择:

Dim value As Object = xmlDoc.SelectNodes("/msb:Project/msb:PropertyGroup/msb:ProjectGuid", NsMgr)

请注意,所有元素都在指定的命名空间中.


令人惊讶的是,从长远来看,它可以节省多少时间来正确使用名称空间.

3> Tomalak..:

这个问题已经好 几次 了.

要么使用与命名空间无关的XPath表达式(不推荐它的笨拙和可能的误报匹配 - 并且对于此表达式是相同的):

//*[local-name() = 'ProjectGuid']

或者您做正确的事情并使用a XmlNamespaceManager来注册名称空间URI,以便您可以在XPath中包含名称空间前缀:

Dim xmlDoc As New XmlDocument()
xmlDoc.Load(Path.Combine(mDirectory, name, name + ".vbproj"))

Dim nsmgr As New XmlNamespaceManager(xmlDoc.NameTable)
nsmgr.AddNamespace("msb", "http://schemas.microsoft.com/developer/msbuild/2003")

Dim xpath As String = "/msb:Project/msb:PropertyGroup/msb:ProjectGuid"
Dim value As Object = xmlDoc.SelectNodes(xpath, nsmgr)

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有