предположим у меня есть таблица базы данных MS SQL Server с именем «группы», такие как:C# - Использование нескольких DataTables одного и того же имени и пространства имен в DataSet
GROUP_ID GROUP_NAME DESCRIPTION
1 Grp1 Null
2 Grp2 Null
3 Grp3 Test
GROUP_ID является первичное поле автоматическое приращение , GROUP_NAME - это уникальное ненулевое поле varchar, а описание - допустимое (необязательное) поле varchar.
Я пытаюсь создать некоторый XML-вывод в качестве веб-сервиса, который будет использоваться каким-либо другим процессом, из информации таблицы. XML должен выводиться определенным образом.
Конечная цель будет выглядеть следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<GROUPS>
<GROUP>
<GROUP_ID>1</GROUP_ID>
<GROUP_NAME>Grp1</GROUP_NAME>
<DESCRIPTION/>
</GROUP>
<GROUP>
<GROUP_ID>2</GROUP_ID>
<GROUP_NAME>Grp2</GROUP_NAME>
<DESCRIPTION/>
</GROUP>
<GROUP>
<GROUP_ID>3</GROUP_ID>
<GROUP_NAME>Grp1</GROUP_NAME>
<DESCRIPTION>Test</DESCRIPTION>
</GROUP>
</GROUPS>
Эта процедура практически получает желаемую цель:
string sql = "SELECT * FROM GROUPS";
Response.ContentType = "application/xml"; // Set the page to output XML
SqlDataAdapter da = new SqlDataAdapter(sql, conn); // SQL Adapter, conn is an already open SQL connection
DataSet ds = new DataSet("GROUPS"); // Root Node of XML doc will be "GROUPS"
da.Fill(ds, "GROUP"); // Each record node is a "GROUP"
XmlTextWriter xml = new XmlTextWriter(Response.Output) { Formatting = Formatting.None }; // XML writer
xml.WriteStartDocument(); // XML header
ds.WriteXml(xml); // Write XML output
Проблема с этой процедурой заключается в том, что она не обеспечивает требуемые пустые узлы, такие как для нулевых значений в таблице. Это будет выглядеть следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<GROUPS>
<GROUP>
<GROUP_ID>1</GROUP_ID>
<GROUP_NAME>Grp1</GROUP_NAME>
</GROUP>
<GROUP>
<GROUP_ID>2</GROUP_ID>
<GROUP_NAME>Grp2</GROUP_NAME>
</GROUP>
<GROUP>
<GROUP_ID>3</GROUP_ID>
<GROUP_NAME>Grp1</GROUP_NAME>
<DESCRIPTION>Test</DESCRIPTION>
</GROUP>
</GROUPS>
После выполнения некоторых исследований, попытка создать желаемый результат был проведен с помощью следующей процедуры:
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "SELECT * FROM GROUPS";
SqlDataReader row = cmd.ExecuteReader();
DataSet ds = new DataSet("GROUPS");
while (row.Read())
{
DataTable table1 = new DataTable("GROUP" + row["GROUP_ID"]); // This line is the issue
object[] columns = new object[row.FieldCount];
for (int i = 0; i < row.FieldCount; i++)
{
string name = row.GetName(i);
table1.Columns.Add(name);
columns[i] = DBstr(row[i]);
}
table1.Rows.Add(columns);
ds.Tables.Add(table1);
}
row.Close();
Response.ContentType = "application/xml"; // Set the page to output XML
XmlTextWriter xml = new XmlTextWriter(Response.Output) { Formatting = Formatting.None }; // XML writer
xml.WriteStartDocument(); // XML header
ds.WriteXml(xml, XmlWriteMode.IgnoreSchema); // Write XML output
public static string DBstr(Object obj)
{
if (obj == null || obj == DBNull.Value)
{
return String.Empty; // Default value for null DB value
}
else if (obj.GetType() == typeof(DateTime))
{
return ((DateTime)obj).ToString("MM/dd/yyyy");
}
else
{
return obj.ToString();
}
}
Проблема здесь в том, что я должен был дать либо уникальное имя для каждого DataTable или уникальное пространство имен. Перед записью xml из DataSet. Так это будет выглядеть примерно так:
<?xml version="1.0" encoding="utf-8"?>
<GROUPS>
<GROUP1>
<GROUP_ID>1</GROUP_ID>
<GROUP_NAME>Grp1</GROUP_NAME>
<DESCRIPTION/>
</GROUP1>
<GROUP2>
<GROUP_ID>2</GROUP_ID>
<GROUP_NAME>Grp2</GROUP_NAME>
<DESCRIPTION/>
</GROUP2>
<GROUP3>
<GROUP_ID>3</GROUP_ID>
<GROUP_NAME>Grp1</GROUP_NAME>
<DESCRIPTION>Test</DESCRIPTION>
</GROUP3>
</GROUPS>
Или каждая группа строк будет иметь XMLNS тег выброшен в
В любом случае, нежелательно.. Итак, какой самый простой способ получить желаемую цель с помощью C# здесь?
FYI, вы не должны использовать 'new XmlTextWriter()'. Вместо этого вы должны использовать 'XmlWriter.Create()'. –