L'analyse du fichier XML à l'aide de C#?
Je suis nouveau sur XML et C#; j'essaie de trouver un moyen efficace de parser un fichier xml pour récupérer des valeurs numériques, base sur la "proj_title" value=heat_run ou de toutes autres valeurs possibles. Par exemple, le calcul de la durée d'un essai (proj_end val-proj_start val).
ex.xml:
<proj ID="2">
<proj_title>heat_run</proj_title>
<proj_start>100</proj_start>
<proj_end>200</proj_end>
</proj>
...
Nous ne pouvons pas rechercher par proj ID puisque cette valeur n'est pas fixe d'essai pour essai. Le fichier ci-dessus est énorme: ~8 mo, et il y a ~2000 balises w/le nom proj_title. est-il un moyen efficace pour d'abord trouver tous les noms de balises w/proj_title="heat_run", puis de récupérer le proj de début et de fin, la valeur de ce particulier proj_title à l'aide de C#??
Voici mon code C#:
public class parser
{
public static void Main()
{
XmlDocument xmlDoc= new XmlDocument();
xmlDoc.Load("ex.xml");
//~2000 tags w/proj_title
//any more efficient way to just look for proj_title="heat_run" specifically?
XmlNodeList heat_run_nodes=xmlDoc.GetElementsByTagName("proj_title");
}
}
OriginalL'auteur jerryh91 | 2013-06-03
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser XPath pour trouver tous les nœuds qui correspondent, par exemple:
XmlNodeList matches = xmlDoc.SelectNodes("proj[proj_title='heat_run']")
matches
contiendra tous lesproj
nœuds qui correspondent aux critères. En savoir plus sur XPath: http://www.w3schools.com/xsl/xpath_syntax.aspLa Documentation MSDN sur SelectNodes
OriginalL'auteur wgraham
8MB n'est vraiment pas très grande par rapport aux normes modernes. Personnellement, je préfère utiliser LINQ to XML:
(Évidemment régler ce à vos propres exigences - ce n'est pas vraiment clair ce que vous devez faire en fonction de la question.)
Alternative requête:
Eh bien, vous pouvez utiliser
Parent
, mais je préfère généralement dans l'autre sens - trouver le parent avec un enfant en particulier.OriginalL'auteur Jon Skeet
Utilisation XDocument et utiliser LINQ api.
http://msdn.microsoft.com/en-us/library/bb387098.aspx
Si la performance n'est pas ce que vous attendez après l'avoir essayé, vous avez à regarder pour un analyseur sax.
Un analyseur Sax ne prendra pas en charge l'ensemble du document dans la mémoire et essayez d'appliquer une expression xpath sur tout dans la mémoire. Il travaille plus dans un événement piloté par l'approche et dans certains cas, cela peut être beaucoup plus rapide et ne pas utiliser plus de mémoire.
Il y a probablement des parseurs sax .NET y est, ne l'ai pas utilisé moi-même .NET mais je n'ai pour le C++.
OriginalL'auteur Philip Stuyck