我正在使用.net 4.0 winforms。在我的应用程序中有一个配置文件(config.xml),在这个文件上我有很多节点和子节点,都是不同的,我想选择所选节点内的特定节点和节点。
我的config.xml(下面)在这个文件中,我想选择一个特定的节点<maintenance_anomalies>
。我如何实现这一目标。
<?xml version="1.0" encoding="utf-8"?>
<Main xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Silvio.Settings">
<!-- Engin -->
<engin>701</engin>
<!-- Journal des erreurs -->
<journal_erreurs>
<emplacement_defaut>true</emplacement_defaut>
<repertoire>D:\</repertoire>
<nom_fichier>SILVIO_log.txt</nom_fichier>
<!-- Debug, Info, Warning, Error ou Nothing -->
<niveau>Info</niveau>
</journal_erreurs>
<!-- Compte-rendu -->
<compte_rendu>
<!-- compte rendu obligatoire? true : obligatoir; false: facultatif -->
<compte_rendu_obligatoire>false</compte_rendu_obligatoire>
<!-- Adresses mail pour envoi du CR -->
<adresses_mail>
<addresse>ext.matis.antoine.decalom@sncf.fr</addresse>
<addresse>cedric.rivet@sncf.fr</addresse>
<addresse>david.niel@sncf.fr</addresse>
<addresse>emilie.jourdain@sncf.fr</addresse>
<addresse>eric.meheust@sncf.fr</addresse>
<addresse>guillaume.delaigue@sncf.fr</addresse>
<addresse>victor.bouthemy@sncf.fr</addresse>
</adresses_mail>
<!-- TOURNEE -->
<tournee_anomalies>
<message>Exploitation</message>
<message>Sillon non-conforme</message>
<message>Superviseur KO</message>
<message>VCube Gauche KO</message>
<message>VCube Droit KO</message>
<message>FishPlate Gauche KO</message>
<message>FishPlate Droit KO</message>
<message>RailHead KO</message>
<message>Redémarrage Superviseur</message>
<message>Redémarrage VCube Gauche</message>
<message>Redémarrage VCube Droit</message>
<message>Redémarrage FishPlate Gauche</message>
<message>Redémarrage FishPlate Droit</message>
<message>Redémarrage RailHead</message>
<message>Engin KO</message>
<message>Engin KO</message>
<message>Watchdog</message>
</tournee_anomalies>
<!-- ABORD -->
<abord_anomalies>
<message>Végétation masquant la signalisation</message>
<message>Arbre menaçant de tomber</message>
<message>Rail à ramasser</message>
</abord_anomalies>
<!--Evol,Par RDE, Le 12/08/2015 et 13/10/2015, cas annulée liste de motifs annulée -->
<observation_annulee_anomalies>
<message>Défaillance système de détection ou de mesure</message>
<message>Défaillance engin moteur</message>
<message>Problème de circulation</message>
<message>Problème de personnel conduite-pilotage</message>
<message>Problème de personnel opérateurs de mesure</message>
</observation_annulee_anomalies>
<!--Evol,Par RDE, Le 13/10/2015, cas annulée liste de détail annulée A -->
<observation_annulee_anomalies_details_A>
<message>Redémarrage V-Cube Droit</message>
<message>Redémarrage V-Cube Gauche</message>
<message>Redémarrage Railhead</message>
<message>Redémarrage Fish-Plate Droit</message>
<message>Redémarrage Fish-Plate Gauche</message>
<message>Redémarrage VCubeCU (Superviseur)</message>
<message>Redémarrage Poutre de géométrie</message>
<message>V-Cube Droit KO</message>
<message>V-Cube Gauche KO</message>
<message>Railhead KO</message>
<message>Fish-Plate Droit KO</message>
<message>Fish-Plate Gauche KO</message>
<message>Superviseur KO</message>
<message>Poutre de géométrie KO</message>
</observation_annulee_anomalies_details_A>
<observation_annulee_anomalies_details_B>
<message>Groupe électrogène KO</message>
<message>Moteur de traction KO</message>
</observation_annulee_anomalies_details_B>
<locng_anomalies>
<message>Mauvaise prise de décision</message>
<message>Mauvais recalage du point kilométrique</message>
<message>Absence d’information dans la base</message>
</locng_anomalies>
<ami_anomalies>
<message>3 ANOMALIES ATTACHES – 3 TRAVERSES CONSECUTIVES MEME COTE DU RAIL</message>
<message>5 ANOMALIES ATTACHES – 5 TRAVERSES CONSECUTIVES MEME COTE DU RAIL</message>
<message>JOINT 4 – 1 OU + BOULONS MANQUANTS</message>
<message>JOINT 5 – 1 OU + BOULONS MANQUANT HORS BOULON EXT COTE 3 TROUS</message>
<message>JOINT 6 – 1 OU + BOULONS INT MANQUANTS</message>
<message>JIC – 1 BOULON MANQUANT AVEC GLISSEMENT</message>
<message>JIC – 2 OU + BOULONS MANQUANTS</message>
<message>JOINT – RUPTURE 1 ECLISSE</message>
<message>JOINT – RUPTURE 2 ECLISSES</message>
<message>JIC – RUPTURE 1 ECLISSE</message>
<message>JIC – RUPTURE 2 ECLISSES</message>
<message>MANQUE DE BALLAST 3 CASES OU + SUPERIEUR A 150 MM</message>
<message>RUPTURE DE RAIL</message>
</ami_anomalies>
</compte_rendu>
<!-- Logs MerMec -->
<logs>
<application>
<nom>VCubeCU</nom>
<dossiers>
<dossier>
<chemin>C:\Program Files\Mermec\VCubeCU</chemin>
<fichiers>
<fichier>AAAAMMJJ_HHMMSS.txt</fichier>
<fichier>AAAAMMJJ_HHMMSS.th.csv</fichier>
<fichier>AAAAMMJJ_HHMMSS.mq.csv</fichier>
</fichiers>
</dossier>
</dossiers>
</application>
<application>
<nom>FishPlateAU - Left</nom>
<dossiers>
<dossier>
<chemin>Z:\Mermec\FishPlateAU\Log</chemin>
<fichiers>
<fichier>AAAAMMJJ_HHMMSS.txt</fichier>
<fichier>AAAAMMJJ_HHMMSS.th.csv</fichier>
<fichier>AAAAMMJJ_HHMMSS.mq.csv</fichier>
<fichier>Breadcrumbs_AAAAMMJJ_HHMMSS</fichier>
</fichiers>
</dossier>
</dossiers>
</application>
</logs>
<!-- Réglages de la compression des données (transferts et logs). -->
<zip>
<sevenZip_dll_path>C:\Program Files\7-Zip\7z.dll</sevenZip_dll_path>
<zip_jpg>true</zip_jpg>
</zip>
<!-- Réglage des paramètres d'invalidations des données GEOV (Ecartement, G3) -->
<GEO>
<invalide_eca>true</invalide_eca>
<invalide_g3>false</invalide_g3>
</GEO>
<!--Evol,Par RDE, Le 01/04/2015, Copie des dossiers en les zippant dans un emplacement prévu ci-dessous. -->
<dossiers_ziped>
<ABORD_ZIPED_FOLDER>D:\Engin_Esv_Zipped\Envoi_Zipped\</ABORD_ZIPED_FOLDER>
<GEO_ZIPED_FOLDER>D:\Engin_Esv_Zipped\Envoi_Zipped\</GEO_ZIPED_FOLDER>
<TOURNEE_ZIPED_FOLDER>D:\Engin_Esv_Zipped\Envoi_Zipped\</TOURNEE_ZIPED_FOLDER>
</dossiers_ziped>
<maintenance_anomalies>
<operation>
<nom_operation>Contrôle visuel des boitiers sous caisse</nom_operation>
<statuts>
<statut>OK</statut>
<statut>NOK</statut>
</statuts>
</operation>
<operation>
<nom_operation>Contrôle de l’humidité dans les boîtiers Surveille</nom_operation>
<statuts>
<statut>OK</statut>
<statut>NOK</statut>
</statuts>
</operation>
<operation>
<nom_operation>Nettoyage des optiques et LED Surveille</nom_operation>
<statuts>
<statut>Fait avant la tournée</statut>
<statut>Fait après la tournée</statut>
<statut>Non fait</statut>
</statuts>
</operation>
</maintenance_anomalies>
</Main>
我尝试了很多解决方案但没有成功。
提前感谢您的帮助。
答案 0 :(得分:2)
这应该会给你正确的结果: -
XDocument doc = XDocument.Load(@"XMLFilePath");
XNamespace ns = "http://schemas.datacontract.org/2004/07/Silvio.Settings";
var result = doc.Root.Element(ns + "maintenance_anomalies")
.Descendants(ns + "nom_operation")
.Select(x =>
new
{
NomOperation = (string)x,
statutList = x.Parent.Element(ns + "statuts")
.Elements(ns + "statut")
.Select(z => (string)z).ToList()
}).ToList();
<强>方法强>
从Xdocument对象中选择Main
的根节点。从中选择元素maintenance_anomalies
,包括与之关联的命名空间。从那里你可以选择nom_operation
的所有后代并获取它的值。要查找statut
内的所有nom_operation
,请返回operation
的父节点,然后从中选择所有statut
元素。
您也可以投射一个Type而不是匿名类型。
获得以下输出: -
答案 1 :(得分:1)
我的xml存在一些问题。首先是一个无效字符,而不是使用Load方法。还有一个名称空间问题,所以我使用Where方法来获取标签maintenance_anomalies。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;
namespace ConsoleApplication53
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
string file = File.ReadAllText(FILENAME);
XDocument doc = XDocument.Parse(file);
XElement maintenance_anomalies = doc.Descendants().Where(x => x.Name.LocalName == "maintenance_anomalies").FirstOrDefault();
XNamespace ns = maintenance_anomalies.Name.Namespace;
var results = maintenance_anomalies.Elements(ns + "operation").Select(x => new{
nom_operation = x.Element(ns + "nom_operation").Value,
statut = string.Join(",",x.Descendants(ns + "statut").Select(y => y.Value).ToArray())
}).ToList();
}
}
}
答案 2 :(得分:0)
下面的行应该让你访问你请求的节点。使用此类是您的班级using System.Xml;
XmlDocument XmlDocObj = new XmlDocument();
XmlNode UserNameNode = XmlDocObj.SelectSingleNode("maintenance_anomalies");