64 votes

XPath + espace de Noms, me rend fou

Son un .vbproj et ressemble à ceci

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <ProjectGuid>15a7ee82-9020-4fda-a7fb-85a61664692d</ProjectGuid>

tout ce que je veux obtenir est la ProjectGuid mais elle ne fonctionne pas si un espace de noms est là-bas...

 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")

que puis-je faire pour résoudre ce problème?

63voto

annakata Points 42676

Je serais probablement enclins à aller avec Bartek de l'* espace de noms solution, mais un xpath solution est:

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

*depuis Bartek réponse a disparu, je vous recommande de Teun (qui est en fait plus approfondie)

44voto

Teun D Points 2445

Le meilleur moyen de faire des choses comme ça (à mon humble avis) est de créer un espace gestionnaire. Ceci peut être utilisé appel SelectNodes pour indiquer l'espace de noms d'Url sont connectés à des préfixes. J'ai l'habitude de définir une propriété statique qui retourne une instance adéquate comme ceci (c'est du C#, vous aurez à traduire):

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

- Je comprendre qu'un seul espace de noms ici, mais vous pourriez en avoir plusieurs. Ensuite, vous pouvez sélectionner à partir du document comme ceci:

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

Notez que tous les éléments sont dans l'espace de noms spécifié.

27voto

Tomalak Points 150423

Ce problème a été ici plusieurs fois déjà.

Soit vous travaillez avec namspace-agnostique expressions XPath:

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

ou vous utilisez un XmlNamespaceManager et d'enregistrer l'espace de noms de sorte que vous pouvez inclure un préfixe d'espace de noms dans vous 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)

3voto

baretta Points 4391

Vous avez juste besoin d'inscrire les espaces de noms XML et de les associer avec un préfixe, pour rendre le travail de requête. Créer et passer d'un espace de noms du gestionnaire en tant que second paramètre lors de la sélection des nœuds:

Dim ns As New XmlNamespaceManager ( xmlDoc.NameTable )
ns.AddNamespace ( "msbuild", "http://schemas.microsoft.com/developer/msbuild/2003" )
Dim value As Object = xmlDoc.SelectNodes("/msbuild:Project/msbuild:PropertyGroup/msbuild:ProjectGuid", ns)

-7voto

Lonzo Points 1280

Pourquoi ne pas utiliser le // d'ignorer l'espace de noms:

Dim value As Object = xmlDoc.SelectNodes("//ProjectGuid")

// agit en tant que wild card à suivre à travers tout ce qui est entre la racine et le nœud suivant nom spécifié(j'.e ProjectGuid)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X