2016-04-23 24 views
0

zum Beispiel i XML folgende haben: Ich möchte das Senderobjekt mit einem XML-Reader lesen:komplexe Typen XML-Leser in C# Handhabung

<gesmes:Sender> 
<gesmes:name>European Central Bank</gesmes:name> 
</gesmes:Sender> 

ich folgende Parser schrieb:

using (var reader = XmlReader.Create(new FileStream(Console.ReadLine(), FileMode.Open, FileAccess.ReadWrite, FileShare.Read))) 
     { 
      while (reader.Read()) 
      { 
       if (reader.NodeType == XmlNodeType.Element) 
       { 
        switch (reader.LocalName) 
        { 
         case "Sender": 
          do 
          { 
           reader.Read(); 
          } while (reader.LocalName != "name"); 
          Console.WriteLine("Sended from:" + reader.ReadElementContentAsString()); 
          break; 
        } 
       } 
      } 
     } 

Das ist nicht ganz elegant, gibt es eine andere Methode mit dem Xml-Reader, oder ist das der einzige Weg?

R3turnz

Antwort

0

Dies ist die beste Methode. Arbeiten Sie immer ohne Fehler. Verwendet XmlReader und Xml Linq.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 
using System.IO; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      using (var reader = XmlReader.Create(new FileStream(Console.ReadLine(), FileMode.Open, FileAccess.ReadWrite, FileShare.Read))) 
      { 
       while (!reader.EOF) 
       { 
        if (reader.Name != "name") 
        { 
         reader.ReadToFollowing("name"); 
        } 
        if(!reader.EOF) 
        { 
         XElement name = (XElement)XElement.ReadFrom(reader); 
        } 
       } 
      } 
     } 
    } 
} 
0

Vielen Dank für Ihre Antworten. Aber ich habe nach einer anderen Methode MIT DEM XML-READER gefragt. Ich werde auf der anderen

0

einen Blick Wenn es ein einzelnes Element ist name, können wir den einfachsten Code verwenden:

string path = "..."; // path to file 
string ns = "..."; // specify correct namespace 

using (var reader = XmlReader.Create(path)) 
{ 
    reader.ReadToFollowing("name", ns); 
    string name = reader.ReadElementContentAsString(); 
    Console.WriteLine(name); 
} 

Wenn es viele Knoten Sender und name und müssen das Niveau der richtig betrachten nisten, müssen wir den Code erschweren:

using (var reader = XmlReader.Create(path)) 
{ 
    while (reader.ReadToFollowing("Sender", ns)) 
    { 
     using (var innerReader = reader.ReadSubtree()) 
     { 
      if (innerReader.ReadToFollowing("name", ns)) 
      { 
       string name = innerReader.ReadElementContentAsString(); 
       Console.WriteLine(name); 
       break; 
      } 
     } 
    } 
} 

Aus meiner Sicht ist es eleganter und richtig sind.

Verwandte Themen