2012-08-13 51 views
0

我有一個包含動態生成的xml文檔的C#.NET應用程序。它跟蹤訂單信息,如名稱,訂單的日期和所有類型的信息。我沒有問題使用innerText提取這些標籤中包含的信息。從C#中具有相同名稱的xml標記中提取值

然而,當訂單是由我們的客戶「建」,他們被允許附加文件....

每個文件被標記

所以我最終下保存在XML文檔的東西(簡體)是這樣的:

<order> 
    <Number>1</Number> 
    <Email>[email protected]</Email> 
    <Date>2012-08-13</Date> 
    <File>File1.txt</File> 
    <File>File2.txt</File> 
</order> 

正如我所說的,我用提取

foreach (XmlElement element in file.SelectNodes("/order")) 
    { 
     String strNumber = element.SelectSingleNode("Number").InnerText, 
       strEmail = element.SelectSingleNode("Email").InnerText, 
       strDate = element.SelectSingleNode("Date").InnerText; 
    } 
其他信息

但是,當我用名稱做這件事時,我得到一個關於沒有被設置爲實例的錯誤...我完全理解。

我的問題是,我怎樣才能得到這個信息?可以附加任意數量的文件,從零到用戶想要的許多文件。

謝謝你的時間。

+4

您已經與「秩序」這樣做。您需要在「foreach」循環中執行相同的「foreach」循環! – banging 2012-08-13 19:52:37

+0

哦,上帝......巨大的大腦放低了那個。多麼尷尬。謝謝。我覺得這樣的胸部.... – mrwienerdog 2012-08-13 19:59:35

+0

@banging - 我很想標記你的答案..把它扔在那裏,所以我可以給你信譽。事實證明(自從我使用XML以來,這已經有點兒了),我並沒有完全擺脫節點......忘記了我的XPATH要領。 – mrwienerdog 2012-08-14 14:26:48

回答

1

這裏是代碼示例。

訂單表示XML爲了

[TestFixture] 
public class ForTest 
{ 
    [Test] 
    public void Test() 
    { 
     var root = XElement.Load("order.xml"); 
     var order = CreateOrder(root); 
    } 

    private Order CreateOrder(XElement element) 
    { 
     var result = new Order 
     { 
      Number = int.Parse(element.Element("Number").Value), 
      Date = DateTime.Parse(element.Element("Date").Value), 
      Email = element.Element("Email").Value, 
      Files = element.Descendants("File").Select(x => x.Value).ToList() 
     }; 
     return result; 
    } 
} 
public class Order 
{ 
    public int Number { get; set; } 
    public string Email { get; set; } 
    public DateTime Date { get; set; } 
    public List<string> Files { get; set; } 
} 
0

這裏是一個基於LINQ的解決方案:

XDocument XMLDoc = XDocument.Load("XMLFile.xml"); 
var LoadInfo = from Node in XMLDoc.Descendants("order")      
       select new 
        { 
        Number = Node.Element("Number").Value, 
        Email = Node.Element("Email").Value, 
        Date = Node.Element("Date").Value, 
        File = Node.Element("File").Value, 
        }; 

用法:

foreach(var Info in LoadInfo) 
    { 
     //Do something with the info. 
     //Console.WriteLine(Info.Email); 
    } 
1

,如果你知道的屬性你可以做到這一點使用序列

[XmlRoot("order")] 
public class order 
{ 
[XmlElement("Number")] 
public string Number{get;set;} 
[XmlElement("Email")] 
public string Email{get;set;} 
[XmlElement("Date")] 
public string Date{get;set;} 
[XmlElement("File")] 
public string[] File{get;set;} 
} 

下面的代碼是反序列化

public static T DeSerializeXMLString<T>(string xmlString) 
    { 
     XmlSerializer xs = new XmlSerializer(typeof(T)); 
     MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(xmlString)); 
     XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); 
     return (T)xs.Deserialize(memoryStream); 
    } 
+0

關於*使用*附近流/作家 – GSerjo 2012-08-13 20:21:44

+0

@GSerjo,請您詳細解釋您的評論。我無法理解。 – Esen 2012-08-13 20:23:07

+0

使用(var memoryStream = new MemoryStream(StringToUTF8ByteArray(xmlString))){...} – GSerjo 2012-08-13 20:29:20

相關問題