2009-07-30 29 views
1

我有如下一個XML文檔:遍歷數據集供應商

<?xml version="1.0" encoding="utf-8" ?> 
<Providers> 
    <Provider> 
     <ProviderType>Email</ProviderType> 
     <ProviderTitle>MyProviderTitle</ProviderTitle> 
     <DeliveryRules> 
      <PersonalDelivery>true</PersonalDelivery> 
     </DeliveryRules> 
     <ProviderConfiguration> 
    <SendTo> 
     <Address>myEmailAddress</Address> 
     <Address>myEmailAddress</Address> 
    </SendTo> 
    </ProviderConfiguration> 
</Provider> 
    <Provider> 
     <ProviderType>Email</ProviderType> 
     <ProviderTitle>MyProviderTitle</ProviderTitle> 
     <DeliveryRules> 
      <PersonalDelivery>true</PersonalDelivery> 
     </DeliveryRules> 
     <ProviderConfiguration> 
    <SendTo> 
     <Address>myEmailAddress</Address> 
     <Address>myEmailAddress</Address> 
    </SendTo> 
    </ProviderConfiguration> 
</Provider> 
</Providers> 

現在我拉進這個使用數據集時:

DataSet dsConfiguration = new DataSet(); 
dsConfiguration.ReadXml("myfile.xml")); 

我如何遍歷提供者?

+0

我無法理解它,我總是使用數據集來保存非常直接的非分層數據。這個結構有點不一樣,你可以看到... – 2009-07-30 11:29:39

回答

1

當涉及到更多的分層數據,你好得多反序列化到一個強類型的對象圖。

這裏是一個非常快的實現,應爲您的示例文件的工作:

[XmlType("Providers")] 
public class Providers : List<Provider> { } 

public class Provider 
{ 
    public string ProviderType { get; set; } 
    public string ProviderTitle { get; set; } 
    public DeliveryRules DeliveryRules { get; set; } 
    public ProviderConfiguration ProviderConfiguration { get; set; } 
} 

public class DeliveryRules 
{ 
    public bool PersonalDelivery { get; set; } 
} 

public class ProviderConfiguration 
{ 
    [XmlArrayItem("Address")] 
    public string[] SendTo { get; set; } 
} 

public static void Main() 
{ 
    var serializer = new XmlSerializer(typeof (Providers)); 
    Providers providers; 
    using (var stream = File.OpenRead("myfile.xml")) 
    { 
     providers = (Providers) serializer.Deserialize(stream); 
    } 
    foreach (var provider in providers) 
    { 
     Console.WriteLine(provider.ProviderTitle); 
     foreach (var address in provider.ProviderConfiguration.SendTo) 
     { 
      Console.WriteLine("\t" + address); 
     } 
    } 
} 

顯然,這種方法需要更多管道的工作,但如果你能得到你的手,描述文檔的格式,那麼你可以將XSD使用XSD.exe工具自動生成所有課程。

1
foreach (var Provider in dsConfiguration.Tables["Provider"].Rows) 
{ 
    // your code here 
} 
+0

那麼這是否意味着我需要創建一個自定義的提供者類? – 2009-07-30 11:31:57

+0

您可以使用此代碼訪問SendTo: Provider.GetChildRows(「Provider_ProviderConfiguration」)[0] .GetChildRows(「ProviderConfiguration_SendTo」) 但我同意Henk,XDocument更合適。 – HuBeZa 2009-07-30 11:56:32