предположим, у меня есть таблица базы данных MS SQL Server с именем "ГРУППЫ", например:
GROUP_ID GROUP_NAME DESCRIPTION
1 Grp1 Null
2 Grp2 Null
3 Grp3 Test
GROUP_ID - это первичное поле с автоматическим приращением, GROUP_NAME - уникальное ненулевое поле varchar, а Description - пустое (необязательное) поле 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();
}
}
Проблема здесь заключается в том, что мне пришлось давать либо уникальное имя для каждой таблицы данных, либо уникальное пространство имен. До выписывания 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>
Или в каждой строке GROUP будет добавлен тег xmlns.
В любом случае, нежелательно. Так какой же самый простой способ получить желаемую цель с помощью C # здесь?