Ne pouvez pas obtenir XmlDocument.SelectNodes retrouver l'une de mes nœuds?
Je suis en train d'analyser un document XML. Le document en question est un fichier AppxManifest.
Un document de l'exemple ressemble à ceci:
<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest" xmlns:build="http://schemas.microsoft.com/developer/appx/2012/build" IgnorableNamespaces="build">
<Identity Name="uytury" Publisher="hygj" Version="1.0.0.12" ProcessorArchitecture="neutral" />
<Properties>
<DisplayName>jhjj</DisplayName>
<PublisherDisplayName>bhhjb</PublisherDisplayName>
<Logo>Assets\StoreLogo.png</Logo>
</Properties>
<Prerequisites>
<OSMinVersion>6.2.1</OSMinVersion>
<OSMaxVersionTested>6.2.1</OSMaxVersionTested>
</Prerequisites>
<Resources>
<Resource Language="EN" />
</Resources>
<Applications>
<Application Id="App" Executable="gfg.exe" EntryPoint="gfg.App">
<VisualElements DisplayName="fdsf" Logo="Assets\Logo.png" SmallLogo="Assets\SmallLogo.png" Description="gfdsg" ForegroundText="light" BackgroundColor="#2672EC">
<DefaultTile ShowName="allLogos" WideLogo="Assets\WideLogo.png" ShortName="gfdsg" />
<SplashScreen Image="Assets\SplashScreen.png" BackgroundColor="#2672EC" />
<InitialRotationPreference>
<Rotation Preference="portrait" />
<Rotation Preference="landscape" />
<Rotation Preference="portraitFlipped" />
<Rotation Preference="landscapeFlipped" />
</InitialRotationPreference>
</VisualElements>
<Extensions>
<Extension Category="windows.search" />
<Extension Category="windows.shareTarget">
<ShareTarget>
<DataFormat>Text</DataFormat>
</ShareTarget>
</Extension>
</Extensions>
</Application>
</Applications>
<build:Metadata>
<build:Item Name="TargetFrameworkMoniker" Value=".NETCore,Version=v4.5" />
<build:Item Name="VisualStudio" Version="11.0" />
<build:Item Name="OperatingSystem" Version="6.2.9200.16384 (win8_rtm.120725-1247)" />
<build:Item Name="Microsoft.Build.AppxPackage.dll" Version="11.0.50727.1" />
<build:Item Name="Microsoft.Windows.UI.Xaml.Build.Tasks.dll" Version="11.0.50727.1" />
</build:Metadata>
</Package>
J'essaie de l'analyser comme suit:
var xml=new XmlDocument();
xml.Load(myfile);
var mgr=new XmlNamespaceManager(xml.NameTable);
mgr.AddNamespace("", "http://schemas.microsoft.com/appx/2010/manifest");
var nodes=xml.SelectNodes("Applications");
Cependant, après que j'ai exécuter cette, nodes
ne comprendront jamais rien. Le document xml est chargé et tels que. à l'aide de SelectNodes("//*")
revient à chaque nœud comme prévu. Qu'est-ce que mon problème ici?
J'ai aussi essayé de nombreuses variations sur cette requête XPath comme
/Package/Applications/Application
Applications/Application
Applications/*
Rien ne s'affiche pour récupérer le nœud unique. Idéalement, j'aimerais que les nœuds pour contenir tous les Application
nœuds
Ton titre parle de XDocument, mais votre code utilise XmlDocument. Si vous étiez vraiment à l'aide de LINQ to XML, j'aimerais simplement vous suggérons d'utiliser des Descendants... est LINQ to XML une option?
malheureusement nous ne pouvons pas utiliser Linq to XML, car nous avons un objectif .Net 2.0. Cependant, je voulais mettre XmlDocument. Je reçois toujours les deux confondus
malheureusement nous ne pouvons pas utiliser Linq to XML, car nous avons un objectif .Net 2.0. Cependant, je voulais mettre XmlDocument. Je reçois toujours les deux confondus
OriginalL'auteur Earlz | 2012-09-26
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser l'espace de noms xml spécifiquement pour les sélectionner. envisager
dans votre cas, ce code peut aussi bien travailler:
mise à jour de l'échantillon était manquante *
Ah, ça fonctionne maintenant. Par hasard est-il une manière plus propre de faire cela? Je n'ai jamais eu affaire avec des espaces de noms avec XPath je suis donc de l'utiliser pour quelque chose de simple et propre comme
/Applications/Application
de travail justesJ'ai eu à l'utiliser il y quelques mois déjà et n'a pas été en mesure de trouver un produit de nettoyage de la syntaxe, mais les XPath 2.0 "//*:nom de" qui n'est pas pris en charge par .net framework système libs. vous pouvez trouver un 3ème partie de XPath 2.0 et XSTL 2.0 produits.
Oh, vous POUVEZ spécifier les espaces de noms dont vous avez besoin via cette surcharge de msdn.microsoft.com/en-us/library/4bektfx9.aspx toutefois, dans mon cas, j'ai fait de traiter les demandes génériques de ces différents espaces de noms/noms versions déclaré afin que la résolution de noms n'a pas été une option pour moi
OriginalL'auteur aiodintsov
Vous devez spécifier les préfixes d'espaces de noms dans NamespaceManager et Xpath. Notez que les préfixes n'a pas besoin de correspondre à rien, sauf entre votre XPath et de votre espace de noms manager*.
Et comme l'ont souligné d'autres réponses XPath qui accepte n'importe quel espace de noms est une autre option.
*) I. e. dans votre exemple il y a 2 espaces de noms "par défaut" (notez que le préfixe par défaut n'est pas le même que le vide de l'espace de noms) et de "construction". Ainsi, lorsque vous définissez votre espace de noms de gestionnaire, vous devez spécifier un préfixe pour chaque espace de noms (si vous avez besoin de cibler les nœuds dans les deux), mais préfixes peuvent être des chaînes arbitraires (valable pour les préfixes, mais ce n'est pas vide). I. e. utilisez "a" pour "par défaut" de l'espace de noms et le "bar" pour l'espace de noms qui mappés à "construire" dans le XML.
Je pense que soit
//a:Applications
oua:Package/a:Applications
, parce que le nœud n'est pas directement sous la racine.L'espace de noms manager doit être transmis à
SelectNodes
:SelectNodes("//a:Applications", mgr);
de l'échantillon fixe (je l'espère) - oubliez de passer de l'espace de noms de la crèche. Et inline MiMo suggestion aussi.
OriginalL'auteur Alexei Levenkov
Vous pourriez avoir besoin pour lire cet
Voici votre code:
OriginalL'auteur Andreas Rehm
Pas dans ce cas particulier, mais en général, si l'espace de noms URN dans le XML n'est pas exactement le même que celui utilisé pour ajouter un espace de noms à un espace de noms manager (exemple: manque un slash de fin), et un préfixe est spécifié dans XPath, la requête peut renvoyer
null
.Si l'espace de noms URN dans le XML n'est pas fiable, la syntaxe
fonctionne.
OriginalL'auteur ajeh