2010-10-26 7 views
2

Quel est un bon moyen de lire ce XML? Ou peut-être que je peux structurer le XML différemment. Ce que je veux, c'est que le processus soit la chose principale et que vous puissiez avoir un certain nombre de processus connexes à suivre.Quelle est une bonne façon de lire ce XML?

<Job> 
    <Process>*something.exe</Process> 
    <RelatedToProcess>*somethingelse.exe</RelatedToProcess> 
    <RelatedToProcess>*OneMorething.exe</RelatedToProcess> 
    </Job> 

J'utilise actuellement XmlNodeList et la lecture du InnerText puis diviser la chaîne sur * mais je sais qu'il doit y avoir une meilleure façon.

+0

Vous avez obtenu quelques bons commentaires sur l'analyse du XML, mais nous sommes un peu dans l'obscurité de ce que vous voulez faire avec le contenu du texte . Vous voulez extraire la sous-chaîne avant et après le *? – LarsH

Répondre

4

Essayez cette application console:

class Program 
{ 
    public class Job 
    { 
     public string Process { get; set; } 
     public IList<string> RelatedProcesses { get; set; } 
    } 
    static void Main(string[] args) 
    { 
     var xml = "<Job>" + 
        "<Process>*something.exe</Process>" + 
         "<RelatedToProcess>*somethingelse.exe</RelatedToProcess>" + 
         "<RelatedToProcess>*OneMorething.exe</RelatedToProcess>" + 
         "</Job>"; 
     var jobXml = XDocument.Parse(xml); 

     var jobs = from j in jobXml.Descendants("Job") 
        select new Job 
        { 
         Process = j.Element("Process").Value, 
         RelatedProcesses = (from r in j.Descendants("RelatedToProcess") 
              select r.Value).ToList() 
        }; 

     foreach (var t in jobs) 
     { 
      Console.WriteLine(t.Process); 
      foreach (var relatedProcess in t.RelatedProcesses) 
      { 
       Console.WriteLine(relatedProcess); 
      } 
     } 

     Console.Read(); 

    } 
} 
5

Je vous suggère d'utiliser Linq To Xml. Vous pouvez charger votre fichier XML au XDocument puis accéder à chaque XElement par nom ou chemin d'accès.

+0

+1 je suggère aussi LINQ à XML –

+0

utiliser linq, cela devrait aider: http: // msforge.net/blogs/janko/archive/2008/01/31/linq-à-xml-interrogation-ajout-mise à jour-et-suppression-xml-data.aspx –

2

Si vous voulez que le processus soit « principale chose » Je recommande XML de restructuration

<Job> 
    <Process Name="*.something.exe"> 
     <RelatedToProcess>*somethingelse.exe</RelatedToProcess> 
     <RelatedToProcess>*OneMorething.exe</RelatedToProcess> 
    </Process> 
    </Job> 

De cette façon, vous pouvez facilement obtenir tous les éléments enfants de l'élément « Process » ... Et logiquement, ils se rapportent (au moins pour moi :)) Si vous utilisez l'attribut ou l'élément est une question de style ...

1

Je voudrais effectivement le stocker légèrement différent. Le concept est que vous créez un type complexe "Process", puis vous le réutilisez dans RelatedProcess et vous pouvez nommer un attribut si vous le souhaitez.

<Job> 
    <Process>something.exe</Process> 
    <RelatedProcess> 
    <Process> 
     <Name>somethingelse.exe</Name> 
    </Process> 
    <Process> 
     <Name>OneMorething.exe 
     </Name> 
    </Process> 
    </RelatedProcess> 
</Job> 

Cela permettrait une meilleure croissance. Par exemple si vous avez décidé d'avoir processeses récursives i.e. .:

<Job> 
    <Process> 
    <Name>something.exe</Name> 
    <RelatedProcess> 
     <Process> 
      <Name>somethingelse.exe</Name> 
      <RelatedProcess> 
      <Process> 
       <Name>recursive.exe</Name> 
      </Process> 
      </RelatedProcess> 
     </Process> 
     <Process> 
      <Name>OneMorething.exe</Name> 
     </Process> 
    </RelatedProcess> 
    </Process> 
</Job> 

Voici un exemple XDocument .. Je ne montre pas la création récursive de processus parce que je ne sais pas si vous vouliez l'utiliser.

string xml = "<Job>...xml here "; 
XDocument doc = XDocument.Parse(xml); 

var Processess = from process in doc.Elements("Job").Elements("Process") 

select new 
{ 
    ProcessName = process.Element("Name"), 
    RelatedProcesses = (from rprocess in process.Elements("RelatedProcess").Elements("Process") 
         select new 
         { 
          ProcessName = rprocess.Element("Name") 
         } 
         ).ToList() 
}; 

Faites-moi savoir si vous avez des questions.

4

J'aime utiliser XmlSerializer pour des tâches simples comme celui-ci, car il en résulte un code beaucoup moins pour traiter le XML. Tout ce dont vous avez besoin est une classe simple qui correspond à votre XML, par ex.

public class Job 
{ 
    public string Process { get; set; } 

    [XmlElement("RelatedToProcess")] 
    public List<string> RelatedProcesses { get; set; } 
} 

Vous pouvez alors lire le XML comme ceci:

XmlSerializer serializer = new XmlSerializer(typeof(Job)); 
using (var reader = XmlReader.Create(@"d:\temp\test.xml")) 
{ 
    Job j = (Job)serializer.Deserialize(reader); 
    Console.WriteLine(j.Process); 
    Console.WriteLine(j.RelatedProcesses.Count); 
    j.RelatedProcesses.ForEach(p => Console.WriteLine(p)); 
} 
2

XDocument à coup sûr!

XDocument xDoc = XDocument.Load("Process.xml"); 
var process = from p in xDoc.Descendants("Process") 
       select p.Value; 

var relatedProcess = from p in xDoc.Descendants("RelatedToProcess") 
        select p.Value; 

Console.WriteLine("Process: {0}", process.ElementAtOrDefault(0).ToString()); 
foreach (var p in relatedProcess) 
    Console.WriteLine("RelatedToProcess: {0}", p); 

Le code imprimera:

Process: *something.exe 
RelatedToProcess: *somethingelse.exe 
RelatedToProcess: *OneMorething.exe 
Questions connexes