Linq to XML从config.xml中选择节点(Lambda表达式或经典查询)

时间:2015-10-19 08:58:36

标签: c# xml linq lambda

我正在使用.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>

我尝试了很多解决方案但没有成功。

提前感谢您的帮助。

3 个答案:

答案 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而不是匿名类型。

获得以下输出: -

enter image description here

答案 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");