使用嵌套元素将DataSet转换为XML

我正在编写一个WebService,它应该将DataSet转换为XML。 我的DataSet实际上是带有类别的酒店列表。 每个酒店可以属于一个或多个类别。 我跟着这里的一个例子,它运作良好,除了我没有得到我想要的结果。

这就是我得到的:(例1)

  Hilton Resort  Hotel   Resort   Golf & Spa    Hyatt  Resort   Golf & Spa    

但是,我想得到这样的东西:(例2)

   Hilton Resort  Hotel Resort Golf & Spa    Hyatt  Hotel Golf & Spa    

这是我当前生成XML的代码,如例1所示:

  ... ... SqlDataAdapter hotelDA = new SqlDataAdapter(SQLHotels, SQLConn); SqlDataAdapter catDA = new SqlDataAdapter(SQLCats, SQLConn); DataSet ds = new DataSet("Hotels"); hotelDA.Fill(ds, "Hotel"); catDA.Fill(ds, "Category"); DataRelation SleepRel = ds.Relations.Add("Hotel", ds.Tables["Sleep"].Columns["Id"], ds.Tables["Category"].Columns["AccID"]); SleepRel.Nested = true; SQLConn.Close(); return ds; 

SQLHotels – 选择所有酒店的SQL SELECT语句
SQLCats – 选择所有类别的SQL SELECT语句
Id – 酒店ID
AccId – 表中的酒店ID类别(外键)

我的问题:
1)它真的重要吗? 一个结构比另一个更好吗?
2)是否可以在DataSet中的两个表之间建立关系,因此我得到的输出就像它在第二个(所需的)XML示例中一样。

一个结构比另一个好吗?

更好的是什么? 如果您希望能够将数据读回到DataSet ,那么DataSet的格式非常好,所以至少,通过该标准,它优于您提议的那个。

一般来说,当您处理XML文档时,您将使用XPath或Linq在其中搜索要使用的元素。 相比:

 var categories = hotelElement.SelectNodes("category"); var categories = hotelXElement.Elements("category"); 

有:

 var categories = hotelElement.SelectNodes("categories/category"); var categories = hotelXElement.Elements("categories").Element("category"); 

拥有中间categories元素可以获得什么? XML在编辑器中看起来更好一些。 这通常不是一个引人注目的优势,特别是如果它使XML更难处理。

是否可以在DataSet中的两个表之间建立关系,因此我得到的输出就像它在第二个(所需的)XML示例中一样。

不。数据集的序列化格式是非常严格定义的。 它支持几个选项(嵌套,包括模式,diffgrams),但格式不会改变(除非你保存为diffgrams,但是如果你这样做,那么XML在你的需求列表中看起来非常低)。

但是,您可以使用XSLT很容易地更改格式。 将此添加到身份转换 :

         

1)它真的重要吗? 一个结构比另一个更好吗?

是,如果您将类别ID添加到cateogry输出中,那么很容易推断出Id与哪个名称相关

  1 Hotel   2 Resort   3 Golf & Spa  

另一方面,这很难说明哪个Id与哪个名称相关,因为关联是位置的。

  1 Hotel 2 Resort 3 Golf & Spa  

2)是否可以在DataSet中的两个表之间建立关系,因此我得到的输出就像它在第二个(所需的)XML示例中一样。

你采取了许多方法来实现这一目标( linq to dataset ,XSLT等),但我无法想到一个直接的方法。

您可以直接从数据库中编写一个能以xml格式生成所需模型的sql,如…

 SELECT HotelName, (select CategoryName from HotelCategories where CategoryHotelName=HotelName for xml path('Category')) as Categories FROM Hotels for xml path('Hotels') 

当然取决于您的数据库布局……