J'ai un fichier XML et j'aimerais parcourir chaque nœud enfant collectant des informations.
Voici mon code C #, il ne prend qu'un seul nœud, le FieldData que j'aimerais utiliser un foreach sur ses nœuds enfants.
public void LoadXML() {
if (File.Exists("Data.xml")) {
//Reading XML
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("Data.xml");
//Think something needs to reference Child nodes, so i may Foreach though them
XmlNodeList dataNodes = xmlDoc.SelectNodes("//FieldData");
TagContents[] ArrayNode;
foreach(XmlNode node in dataNodes) {
int Count = 0;
//int Max = node.ChildNodes.Count;
ArrayNode = new TagContents[Max];
ArrayNode[Count].TagName = node.Name;
ArrayNode[Count].TagValue = node.SelectSingleNode(ArrayNode[Count].TagName).InnerText;
Count = Count + 1;
}
} else {
MessageBox.Show("Could not find file Data.xml");
}
}
Mon XML ressemble à quelque chose comme:
<?xml version="1.0"?>
<FieldData>
<property_details_branch IncludeInPDFExport="Yes" Mod="20010101010101"/>
<property_details_inspection_date IncludeInPDFExport="Yes" Mod="20120726200230">20120727220230+0200</property_details_inspection_date>
<property_details_type_of_ownership IncludeInPDFExport="Yes" Mod="20120726134107">Freehold</property_details_type_of_ownership>
</FieldData>
Vous effectuez une itération des nœuds FieldData et vous n'en avez qu'un. Pour itérer ses nœuds enfants, écrivez:
foreach (XmlNode node in dataNodes)
{
foreach (XmlNode childNode in node.ChildNodes)
{
Je préfère généralement Linq-To-Xml pour ce genre de chose:
var doc = XDocument.Load("XMLFile1.xml");
foreach (var child in doc.Element("FieldData").Elements())
{
Console.WriteLine(child.Name);
}
Ou vous utilisez la récursivité:
public void findAllNodes(XmlNode node)
{
Console.WriteLine(node.Name);
foreach (XmlNode n in node.ChildNodes)
findAllNodes(n);
}
Où placez-vous la charge utile dépend du type de recherche que vous souhaitez utiliser (par exemple, recherche en largeur d'abord, recherche en profondeur d'abord, etc.; voir http://en.wikipedia.org/wiki/Euler_tour_technique )
Vous pouvez le faire comme ça:
XDocument doc = XDocument.Load(@"Data.xml");
TagContents[] ArrayNode = doc.Root
.Elements()
.Select(el =>
new TagContents()
{
TagName = el.Name.ToString(),
TagValue = el.Value
})
.ToArray();
Il suffit de toucher à la réponse de @Waynes, qui a bien fonctionné. J'ai utilisé le code ci-dessous pour pousser plus loin dans les nœuds enfants dans mon xml
foreach (var child in doc.Element("rootnodename").Element("nextchildnode").Elements())
{
//do work here, probs async download xml content to file on local disc
}
public void ValidateXml(string[] Arrays)
{
foreach (var item in Arrays)
{
Xdoc.Load(item);
XmlNodeList xnList = Xdoc.SelectNodes("FirstParentNode");
if (xnList.Count > 0)
{
foreach (XmlNode xn in xnList)
{
XmlNodeList anode = xn.SelectNodes("SecondParentNode");
if (anode.Count > 0)
{
foreach (XmlNode bnode in anode)
{
string InnerNodeOne = bnode["InnerNode1"].InnerText;
string InnerNodeTwo = bnode["InnerNode1"].InnerText;
}
}
else
{
ErrorLog("Parent Node DoesNot Exists");
}
}
}
else
{
ErrorLog("Parent Node DoesNot Exists");
}
}
//then insert or update these values in database here
}
Pour parcourir chaque nœud enfant, sous-nœud, etc., nous devons utiliser Recursion
. Au cas où quelqu'un aurait les mêmes exigences que moi, j'ai obtenu ce résultat, comme ci-dessous -
public string ReadAllNodes(XmlNode node)
{
if (node.ChildNodes.Count > 0)
{
foreach (XmlNode subNode in node)
{
//Recursion
ReadAllNodes(subNode);
}
}
else //Get the node value.
{
finalText = finalText + node.InnerText + System.Environment.NewLine;
}
return finalText;
}