2009-10-01 8 views
0

Voici l'exemple d'un document XML.XML avec C# LINQ vers XML

<People> 
    <Person> 
     <Name>ABC </Name> 
     <SSN>111111</SSN> 
     <Address>asdfg</Address> 
    </Person> 
</People> 

J'ai besoin d'obtenir les noms des étiquettes, mais pas les valeurs entre les noms des étiquettes. Autrement dit, sous la balise de personne, je devrais saisir les nœuds Name, SSN et Address et non les valeurs ABC, 111111 et asdfg. Je dois utiliser LINQ to XML et l'interroger en C#.

Comment puis-je le faire?

+0

Certaines raisons expliquent que mon exemple de document XML ne s'affiche pas correctement ci-dessus. Basicaly. Il a un tag principal People. Sous lequel j'ai tag person. Qui a Nom, SSN et adresse Tags (chacun a des valeurs). Je dois obtenir les noms des étiquettes et non les valeurs –

+0

Je l'ai réparé pour vous! – Larsenal

Répondre

4

Cela renvoie les noms comme une liste de chaînes:

var doc = XDocument.Parse(@"<People> 
    <Person> 
     <Name>ABC </Name> 
     <SSN>111111</SSN> 
     <Address>asdfg</Address> 
    </Person> 
</People>" 
); 

var list = doc.Root.Element("Person").Descendants() 
       .Select(node => node.Name.LocalName).ToList(); 

Si vous utilisez un XElement au lieu d'un XDocument, vous pouvez supprimer le .Root du code ci-dessus et obtenir des résultats corrects.

+1

+1 pour être la seule réponse jusqu'à présent à utiliser réellement LINQ avec les classes LINQ to XML. –

0

Vous pouvez l'obtenir de cette façon ...

string xml = "<People> <Person> <Name>ABC </Name> <SSN>111111</SSN> <Address>asdfg</Address> </Person> <Person> <Name>ABC </Name> <SSN>111111</SSN> <Address>asdfg</Address> </Person> </People>"; 

XElement xmlData = XElement.Parse(xml); 

foreach(XElement xmlPerson in xmlData.Elements("Person")) 
{ 
    List<string> TagsForThisPerson = new List<string>(); 
    foreach(XElement xmlTag in xmlPerson.Elements()) 
    { 
     TagsForThisPerson.Add(xmlTag.Name.ToString()); 
    } 
    TagsForThisPerson.Dump(); 
} 
1

Créer une classe

public class Person 
{ 
    public string Name {get; set;} 
    public int SSN {get; set;} 
    public string Address {get; set;} 
} 

Et créer une nouvelle personne de cette façon;

List<Person> NewPersons = new List<Person>(); 
XDocument doc = XDocument.Load(xmlFile);  
foreach(XElement xElem in doc.Descendants("Person")) 
{ 
    NewPersons.Add(new Person 
      { 
       Name = xElem. Element("Name").Value, 
       SSN = xElem.Element("SSN").Value, 
       Address = xElem.Element("Address").Value, 
      }); 
} 
0

simple LINQ syntaxe pour obtenir les noms est ci-dessous. Il suppose que vous avez le XML chargé dans une variable XDocument nommée doc.

var nodeNames = from node in doc.Descendants("Person").First().Descendants() 
       select node.Name.LocalName; 

Il ne regarde que la première personne. Si vous en avez plus d'un dans le document XML, la liste des noms n'est probablement pas ce que vous voudriez (pas de raison de répéter tous les noms des nœuds encore et encore). De cette façon, vous obtenez une liste de noms de nœuds pour la première personne, mais cela suppose que le premier aurait une liste complète de noms. Si elles varient, vous devrez créer une liste distincte de tous les nœuds.