[英]XML in foreach loop from dataset in C#
我必須在C#中動態創建一個非常特定的形狀XML文件,以便為網站上的flash對象提供動力。 我在許多嘗試中遇到的問題是,大多數輸出都希望每個節點都有某種獨特的識別方式,我不希望這樣。 相反,下面是我要追求的輸出,而不是我目前可以獲得的輸出。 請注意,它也是無效的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>
......等等。 節點標題或者不能更改,也不能為每棵樹的根目錄。
到目前為止我的代碼看起來像這樣,在我看來它似乎應該工作,但事實並非如此。
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);
}
}
考慮使用XmlWriter獲得更多控制和靈活的文檔結構
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>");
我希望它看起來更像這樣:
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);
}
下面的示例從第一個表讀取行並將它們轉換為行元素,提供轉換為列元素的內容列值。
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
));
我還將DataTable轉換為單獨的(擴展)方法:
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())
));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.