2014-09-12 62 views
-3

爲初學者在C#中:我用Google搜索周圍,但在一個「簡單問題」迷路了:讀取XML,排序上的屬性,並寫入文本文件c#

Read a XML : 

    <persons>  this is sample 
     <person id="0"> 
     <Lname>Johnson</Lname> 
     <Fname>Molly</Fname> 
     </person> 
     <person id="1"> 
     <Lname>buffalo</Lname> 
     <Fname>Mike</Fname> 
     </person> 
     <person id="2"> 
     <Lname>COOLS</Lname> 
     <Fname>WALTER</Fname> 
     </person> 
     <person id="3"> 
     <Lname>FROMUS</Lname> 
     <Fname>LUDOVICUS</Fname> 
    </persons> 

我需要梳理了lname(姓氏)和Fname(名字)
並且在文本文件(txt)中列表爲 有

EG喲看到2人有約克的Lname,然後排序Fname。

Case John 
Buffalo Mike 
York Theo 
York Viviane 

lname和Fname應該在同一行上,但爲下一個Lname,Fname換一個新行。
那不是在這個問題上,因爲語法問題,這個工具(對不起)

其他信息在這裏:我嘗試使用的foreach使用var指令列出了,但得到了混亂。 目標是儘可能地使用例如LINQ和OO(面向對象)。

非常感謝

我的意見的迴應:


首先我想爲badformed XML -the最後的標籤有一個錯誤/符號道歉。 語言確實是荷蘭語(荷蘭) - 我將標籤名稱改爲英文。

我已經擁有的是閱讀XML文件並對屬性「id」進行排序並寫入平面文件。然後我試圖通過使用orderedby行使「的foreach VAR結構,使之更加OO

代碼我現在有。

using System; 
using System.Collections.Generic; 
using System.Xml.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.ComponentModel; 
using System.Data; 
using System.IO; 
using System.Xml; 
using System.Net; 

namespace ConsoleApplication3 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

     XmlReader reader = XmlReader.Create("c:/download/test.xml"); 

      List<string> Collectperson = new List<string>(); 
      Collectperson.Clear(); 

      string personid = ""; 
      string nm = ""; 
      string vn = ""; 
      string oneline = ""; 
      while (reader.Read()) 
      { 

       if (reader.NodeType != XmlNodeType.EndElement) 
       { 

        // Get element name and switch on it. 
        switch (reader.Name) 
        { 
         case "persoon": 
          // Detect this element. 
          // initialize collectperson 
          Collectperson.Clear(); 

          Console.WriteLine(" " + reader.GetAttribute(0)); 
          Collectperson.Add(reader.GetAttribute(0)); 
          // add to file ans reinitialize string 
          oneline = ""; 
          oneline = string.Join(" ", Collectperson.ToArray()); 

          break; 
         // 
         case "naam": 
          if (reader.Read()) 
          { 
           Console.WriteLine(reader.Value); 
           nm = reader.Value; 
           Collectperson.Add(nm); 
           oneline = string.Join(" ", Collectperson.ToArray()); 

          } 
          break; 

         case "voornaam": 
          if (reader.Read()) 
          { 
           Console.WriteLine(reader.Value); 
           vn = reader.Value; 
           Collectperson.Add(vn); 
           oneline = string.Join(" ", Collectperson.ToArray()); 

     // ================================================================================== 
           string path = @"c:/download/personen.txt"; 
           // This text is added only once to the file. 
           if (!File.Exists(path)) 
           { 
            // Create a file to write to. 
            using (StreamWriter sw = File.CreateText(path)) 
            { 
             sw.WriteLine(oneline); 
            } 
           } 

           // This text is always added, making the file longer over time 
           // if it is not deleted. 
           using (StreamWriter sw = File.AppendText(path)) 
           { 
            sw.WriteLine(oneline); 
           } 

     //================================================================================== 

          } 
          break; 
        } // switch 
       } 
      } // while 
     } 
    } 
} 
+2

讓我們看看你已經嘗試什麼,爲什麼* *你覺得自己 「搞砸得到了。」這聽起來像你有三個問題:如何讀取XML,如何排序,以及如何寫入文本文件。你試過把它分解嗎? – 2014-09-12 13:40:24

+1

該xml無效。你的結尾'personen'標記不正確,並且'persoon id =「3」'沒有結束標記。 – gunr2171 2014-09-12 13:45:31

+0

1.標點符號和拼寫是展示您付出一些努力的好方法。 2.分手(閱讀XML,排序,寫),然後尋找個別問題的答案。這些問題之前已經詢問過,不難發現 – Peter 2014-09-12 13:45:47

回答

1

加載XML文件到你的模型,你可以使用XmlSerializer.Deserialize

using (var sw = new StreamReader(iPathToXMLFile, Encoding.Default)) 
{ 
    var ser = new XmlSerializer(typeof(T)); 
    val = (T)ser.Deserialize(sw); 
} 

然後,您可以創建一個「人」對象的類,然後實現IComparable能夠何許人:) 列表例如:How do I sort an array of custom classes?

[EDIT1]

另一種方式:

public class Person 
{ 
    public String FirstName { get; set; } 
    public String LastName { get; set; } 
} 

var list = new List<Person> 
{ 
    new Person {FirstName = "Viviane", LastName = "York"}, 
    new Person {FirstName = "Mike", LastName = "Buffalo"}, 
    new Person {FirstName = "Theo", LastName = "York"}, 
    new Person {FirstName = "John", LastName = "Case"} 
}; 

var sorted = list.OrderBy(p => p.LastName).ThenBy(p => p.FirstName).ToList(); 

[EDIT2]:IComparable的解決方案

public class Person : IComparable<Person> 
{ 
    public String FirstName { get; set; } 
    public String LastName { get; set; } 

    public int CompareTo(Person obj) 
    { 
     var val = String.Compare(LastName, obj.LastName, StringComparison.Ordinal); 

     // Same LastName case 
     if (0 == val) 
      val = String.Compare(FirstName, obj.FirstName, StringComparison.Ordinal); 

     return val; 
    } 
} 

     var list = new List<Person> 
     { 
      new Person {FirstName = "Viviane", LastName = "York"}, 
      new Person {FirstName = "Mike", LastName = "Buffalo"}, 
      new Person {FirstName = "Theo", LastName = "York"}, 
      new Person {FirstName = "John", LastName = "Case"} 
     }; 


     list.Sort(); // Sort will call IComparable implementation of the Person class 

[EDIT3]

您還可以使用的IComparer,代表們......我讓你在網上搜索這個。

+0

?????什麼是'persoon' – MethodMan 2014-09-12 13:44:30

+1

@DJKRAZE我會打賭你想要的那個人物是一個對象 – DidIReallyWriteThat 2014-09-12 13:45:53

+1

@DJKRAZE,不幸的是它的拼寫正確的例子xml。 – gunr2171 2014-09-12 13:46:13

0

此視頻可能會幫助你。他首先解釋了使用XML,然後解釋了Json。我更喜歡Json,你也可能在看完之後。鮑勃塔博爾解釋得很好。希望這可以引導你走上正確的道路。

< < Storing and retrieving Serialized Data >>