2010-08-18 5 views
1

J'ai inclus un fichier XML dans mon formulaire InfoPath en tant que source de données secondaire. La connexion de données est nommée Divisions. Ci-dessous la structure et le contenu du fichier:Requête XML Infopath de C#

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Divisions> 
    <Division> 
     <Name>Business Application Services</Name> 
     <Abbr>BAS</Abbr> 
    </Division> 
    <Division> 
     <Name>Network Security Services</Name> 
     <Abbr>NSS</Abbr> 
    </Division> 
    <Division> 
     <Name>Back Office</Name> 
     <Abbr>BO</Abbr> 
    </Division> 
</Divisions> 

Ce que je dois faire est requête ce fichier en utilisant le Abbr de la division pour obtenir le Name.

J'ai utilisé le code suivant pour créer un XPathNodeIterator:

XPathNodeIterator XPNIDivisions = this.DataSources["Divisions"].CreateNavigator().Select("/Divisions/Division/Name"); 

Alors maintenant, comment puis-je rechercher le nom de la division dont Abbr est 'NSS'? Ou est le code que j'utilise mal (je suis nouveau à la manipulation XML)? Veuillez noter que ces abréviations et noms pourraient changer (d'autres pourraient être ajoutés ou certains pourraient être supprimés); donc j'ai besoin d'être dynamique, ce qui signifie que si j'ai le Abbr dans une variable MyAbbr, je dois rechercher son Name.

Merci à l'avance,

Yusuf

Répondre

1

Enfin, j'ai pu trouver une solution, et je dois dire que c'est un peu plus complexe que la solution de Roger; vous devez connaître un peu les expressions XPath.

donc ce que je devais faire était tout simplement changer la sélection d'avant

XPathNodeIterator XPNIDivisions = this.DataSources["Divisions"].CreateNavigator().Select("/Divisions/Division/Name"); 

à

XPathNodeIterator XPNIDivisions = this.DataSources["Divisions"].CreateNavigator().Select("/Divisions/Division[Abbr=\"thevalue\"]"); 

thevalue est bien sûr la valeur que vous cherchez.

En fait ce que je faisais était de définir une variable chaîne

StrXPathDiv = "/Divisions/Division[Abbr=\"" + thevalue + "\"]"; 

puis passer à la méthode Select().

Ensuite, utilisez le code suivant pour obtenir la valeur:

if (XPNIDivisions.MoveNext()) //If any record found 
{ 
    XPNIDivisions.Current.MoveToChild(XPathNodeType.Element); 
    XPNavMyDivision.SetValue(XPNIDivisions.Current.Value); 
} 
else { XPNavMyDivision.SetValue(""); } 

XPNavMyDivision est le navigateur pour savoir où je dois définir la valeur.

Merci beaucoup pour votre temps et aidez Roger; J'aurais essayé votre solution si j'étais sûr que tout le monde avait .NET 3.5 installé; Cependant, je suis tout à fait sûr du contraire, donc je devais m'en tenir à cela.

+0

Ne pas oublier d'échapper apostrophes dans la valeur - voir http://stackoverflow.com/questions/1341847/special-character-in-xpath-query – marapet

+0

oui, c'est ce que j'ai fait ici: StrXPathDiv = "/ Divisions/Division [Abbr = \ "" + la valeur + "\"] "; avec le '\" ' – Yusuf

1

Peut-on utiliser LINQ to Xml? j'ai pu obtenir ce travail

string name = XDocument.Load("XMLFile1.xml") 
      .Descendants("Division") 
      .Where(x => x.Element("Abbr").Value == "NSS") 
      .First() 
      .Element("Name") 
      .Value; 
+0

Ai-je besoin de quelque chose de spécifique pour pouvoir utiliser Linq en XML? Comment 'XDocument' est-il dans votre exemple? – Yusuf

+0

Vous devez avoir .NET 3.5 ou supérieur - donc cela pourrait être un briseur d'affaire. XDocument est Linq à la version Xml de XmlDocument. – RogerNoble

+0

'XDocument' est dans l'espace de nom et l'assembly' System.Xml.Linq' –