2016-04-23 52 views
0

,比如我有以下XML: 我想讀一個XML閱讀器發件人對象:處理複雜的類型在C#中的XML閱讀器

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

我寫了下面的解析器:

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; 
        } 
       } 
      } 
     } 

這不太優雅,是否有另一種Xml讀取器的方法,或者這是唯一的方法?

R3turnz

回答

0

這是最好的方法。始終無誤地工作。使用XmlReader和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

謝謝你的回答。但是我試圖用XML-READER來尋求另一種方法。我會看看其他

0

如果有一個單一的元素name,我們可以用最簡單的代碼:

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); 
} 

如果有很多節點Sendername,必須妥善考慮的水平嵌套,我們必須複雜的代碼:

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; 
      } 
     } 
    } 
} 

在我看來,它更加優雅和正確。