2012-10-31 54 views
1

我必須在C#中動態創建非常特定的形狀XML文件,以便爲網站上的Flash對象供電。我在許多嘗試中遇到的問題是,大多數輸出​​都希望每個節點都有一些獨特識別方式,我不想那樣做。相反,下面是我所追求的輸出,而不是我目前可以得到的輸出。請注意,它也是無效的XML。從C#中的數據集的foreach循環中的XML

<data> 
    <Annual Enrollment> 
     <row> 
      <column>value1</column> 
      <column>value2</column> 
      <column>value3</column> 
     </row> 
     <row> 
      <column>value1</column> 
      <column>value2</column> 
      <column>value3</column> 
     </row> 
    </Annual Enrollment> 
    <Pre-College> 
     <row> 
      <column>value1</column> 
      <column>value2</column> 
      <column>value3</column> 
     </row> 
     <row> 
      <column>value1</column> 
      <column>value2</column> 
      <column>value3</column> 
     </row> 
    </Pre-College> 

....等等。節點標題or不能改變,也不能改變每個樹的根。

我到目前爲止的代碼看起來像這樣,在我的腦海中,它似乎應該工作,但事實並非如此。

var tableResult = DashboardData.GetMetricData(1); 
    // Outlinining structure 
    XDocument document = new XDocument(
     new XDeclaration("1.0", "utf-8", null), 
     new XElement("data", 
      new XElement("AnnualEnrollment"), 
      new XElement("Pre-College"), 
      new XElement("Summary") 
      )); 
    // Now I need to append children to each of the three nodes within the root "data" 
    foreach (DataRow row in tableResult.Tables[0].Rows) 
    { 
     document.Element("AnnualEnrollment").Add(new XElement("row")); 

     foreach (var item in row.ItemArray) 
     { 
      var element = new XElement("column", item); 


     } 
    } 
+3

這有點不工作?如果輸出不符合您的期望,您是否可以更新您的問題? –

+0

我更新了一下文字。很多問題來自它首先是無效的XML。 .Net不希望你創建無效的XML。我開始認爲我可能不得不使用一個Streamwriter並按樹編寫樹,只保存爲.xml。 – JCanlett

+1

你是說你需要創建無效的XML嗎? –

回答

0

下面的示例從第一個表中讀取行並將它們轉換爲行元素,將內容列值轉換爲列元素。

XDocument document = new XDocument(
    new XDeclaration("1.0", "utf-8", null), 
    new XElement("data", 
     new XElement("AnnualEnrollment", 
      from row in tableResult.Tables[0].AsEnumerable() 
      select new XElement("row", 
       from column in tableResult.Tables[0].Columns.Cast<DataColumn>() 
       select new XElement("column", row[column]))), 
     new XElement("Pre-College"), // same for pre-college table 
     new XElement("Summary") // and same for summary 
     )); 

而且我倒是提取數據錶轉換成獨立的(擴展)方法:

public static object ToXml(this DataTable dataTable) 
{ 
    return from row in dataTable.AsEnumerable() 
      select new XElement("row", 
         from column in dataTable.Columns.Cast<DataColumn>() 
         select new XElement("column", row[column])); 
} 

現在你的XML生成的樣子:

XDocument document = new XDocument(
    new XDeclaration("1.0", "utf-8", null), 
    new XElement("data", 
     new XElement("AnnualEnrollment", tableResult.Tables[0].ToXml()), 
     new XElement("Pre-College", tableResult.Tables[1].ToXml()), 
     new XElement("Summary", tableResult.Tables[2].ToXml()) 
     )); 
+0

如果你確實需要'AnnualEnrollment'之間的空格,那麼就簡單地執行'document.ToString()。Replace(「AnnualEnrollment」,「Annual Enrollment」)' –

1

我希望它看起來更像是這樣的:

foreach (DataRow row in tableResult.Tables[0].Rows) 
    { 
    XElement aRow = new XElement("row") 

    foreach (var item in row.ItemArray) 
    { 
      aRow.Add(new XElement("column", item)) 
    } 

    document.Element("AnnualEnrollment").Add(aRow); 

    } 
3

考慮使用的XmlWriter以獲得有關文檔結構更多的控制和flexbilily

var docBuilder = new StringBuilder(); 
using (var writer = XmlWriter.Create(docBuilder)) 
{ 
    writer.WriteStartElement("data"); 
    writer.WriteStartElement("AnnualEnrollment"); 
    foreach (var row in dataTable.Rows) 
    { 
     writer.WriteStartElement("row"); 
     foreach (var item in row.ItemArray) 
      writer.WriteElementString("column", item); 
     writer.WriteEndElement(); // row 
    } 
    writer.WriteEndElement(); // Annual Enrollment 
    writer.WriteEndElement(); // data 
} 
docBuilder.Replace("<AnnualEnrollment>", "<Annual Enrollment>"); 
+0

Lukas!真棒的想法。我認爲這將是理想的完美,這就是價值如何依次寫入。基本上調用19個存儲過程併爲XCelsius對象創建一個大型數據源。 XmlWriter將允許我以我想要的方式完成它。 – JCanlett

+0

是的,我需要編寫無效的XML,所使用的工具的錯誤,而不是開發人員! =) – JCanlett

+0

好老的foreach ;-)但我認爲主要問題沒有解決。據我所知,user1789915需要在「年度註冊」這個非法元素名稱之間的空格。 –