Analyse des balises XML internes à l'aide de C#
-
21-12-2019 - |
Question
<career code="17-1011.00">
<code>17-1011.00</code>
<title>Architects</title>
<tags bright_outlook="false" green="true" apprenticeship="false" />
<also_called>
<title>Architect</title>
<title>Project Architect</title>
<title>Project Manager</title>
<title>Architectural Project Manager</title>
</also_called>
<what_they_do>Plan and design structures, such as private residences, office buildings, theaters, factories, and other structural property.</what_they_do>
<on_the_job>
<task>Consult with clients to determine functional or spatial requirements of structures.</task>
<task>Prepare scale drawings.</task>
<task>Plan layout of project.</task>
</on_the_job>
</career>
J'ai récupéré ce XML renvoyé par ONet et j'aimerais analyser les informations à utiliser.Voici le code que j'ai écrit pour essayer d'analyser le texte interne des balises sous, l'entrée étant le XML Onet.
XmlDocument inputXML = new XmlDocument();
inputXML.LoadXml(input);
XmlElement root = inputXML.DocumentElement;
XmlNodeList titleList = root.GetElementsByTagName("also_called");
for (int i = 0; i < titleList.Count; i++)
{
Console.WriteLine(titleList[i].InnerText);
}
J'attends une NodeList de taille quatre.Cependant, lorsque j'imprime le résultat, le résultat est une taille de 1 :"ArchitecteArchitecte de projetChef de projetChef de projet architectural"
Ai-je mal construit ma liste de titres XMLNodeList ?Comment puis-je parcourir et traiter davantage l'arborescence XML pour obtenir les valeurs internes des balises « titre » sous « aussi_appelé » ?
La solution
Vous obtenez les éléments nommés also_called
.Il n'y a qu'un seul élément de ce type dans votre liste.Ce que vous voulez probablement, c'est amener les enfants du also_called
nœud.
Par exemple:
XmlNodeList also_calledList = root.GetElementsByTagName("also_called");
XmlNode also_calledElement = also_calledList[0];
XmlNodeList titleList = also_calledElement.ChildNodes;
foreach (XmlNode titleNode in titleList)
{
Console.WriteLine(titleNode.InnerText);
}
Pensez également à utiliser XDocument
et LINQ to XML au lieu de XmlDocument
- c'est beaucoup plus simple à utiliser :
XDocument root = XDocument.Parse(input);
foreach (XElement titleNode in root.Descendants("also_called").First().Elements())
{
Console.WriteLine(titleNode.Value);
}
Autres conseils
Vous avez juste besoin d'un tout petit peu de XPath.Ceci sélectionne tous les title
nœuds qui sont les enfants du premier also_called
.
XmlDocument inputXML = new XmlDocument();
inputXML.LoadXml(input);
foreach(var node in root.SelectNodes("also_called[1]/title"))
{
Console.WriteLine(node.InnerText);
}
Il est rare que vous ayez besoin d'utiliser GetElementsByTagName
ou ChildNodes
et leurs semblables et/ou essayez d'inspecter un nœud afin de déterminer si c'est celui que vous voulez.Naviguer dans XML avec XmlDocument
il s'agit avant tout d'utiliser XPath avec lequel vous pouvez spécifier un peu lorsqu'il s'agit d'obtenir des nœuds qui répondent à des critères spécifiques ;à la fois en termes de structure au sein de l’arborescence et de contenu.