它是一个.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")
我该怎么做才能解决这个问题?
我可能倾向于使用Bartek的*命名空间解决方案,但一般的xpath解决方案是:
//*[local-name()='ProjectGuid']
**自从Bartek的回答消失后,我推荐Teun(实际上更彻底)*
这样做(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)
请注意,所有元素都在指定的命名空间中.
这个问题已经好 几次 了.
要么使用与命名空间无关的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)