2012-05-08 41 views
2

我需要帮助将DataTable转换为XML。我已经使用LINQ完成了它,但我无法完全按照我的要求。我做了一张照片,以便您可以轻松理解。 XML需要像下面那样格式化,所以我不能只使用dt.writexml()。艺术家ID需要自动编号。歌曲由艺术家分组。首选Linq coz的解决方案,这是我在整个项目中使用的方法,但我无法在这里获得我想要的。列名是已知的,所以你可以在代码中使用类似的东西。 row.Field(Of String)(“title”)需要帮助将DataTable转换为XML VB.NET

非常感谢。我是认真的。对不起英文不好。

enter image description here

CreateDatatable - 这个简单的代码应该创建一个DataTable

  Dim dTable As New DataTable 
      dTable.Columns.Add("Title") 
      dTable.Columns.Add("Artist") 
      dTable.Columns.Add("Album") 

      dTable.Rows.Add("Baby one more time", "Britney Spears", "Baby one more time") 
      dTable.Rows.Add("Crazy", "Britney Spears", "Best of") 
      dTable.Rows.Add("Every time", "Britney Spears", "Best of") 
      dTable.Rows.Add("Black and White", "Michael Jackson", "Best of") 
      dTable.Rows.Add("You are not alone", "Michael Jackson", "Best of") 
      dTable.Rows.Add("Smile", "Michael Jackson", "Best of") 

我有什么的时刻。它会将数据转换为xml而无需分组和索引索引。

 Dim xmlDoc As New XDocument(
     From row In dt.Rows 
     Select XElement("SONG", 
     From column In dt.Columns 
      Select 
       New XAttribute(column.Name, row.Item(column.Name)) 
      ) 
    ) 

好..我也有一些更多的代码..这将首先查询创建的XML和做分组,但仍然在歌曲元素属性专辑=“ALBUMNAME”。它应该只是从数据表到XML的一个查询..我讨厌不得不再次查询对XML再refomat它。

Dim replacement = New XDocument(New XElement("root", 
    original.Descendants("Song") 
    .GroupBy(Function(x) Convert.ToString(x.Element("artist").value)) 
    .[Select](Function(songsForArtist, index) 
    New XElement("artist", New XAttribute("id", index + 1), 
    New XAttribute("name", songsForArtist.Key), songsForArtist)))) 
+0

如果你提供的代码来创建数据表样品会更容易为我们提供帮助。 –

+0

感谢家伙..我编辑了帖子..请看。 – lawphotog

+0

我误解了蒂姆的评论,我把一些代码创建一个简单的数据表,在我的第一个例子谢谢 – lawphotog

回答

1

我希望你可以把它转换为VB.NET

using System; 
    using System.Linq; 
    using System.Data; 
    using System.Xml.Linq; 

    namespace ConsoleApplication3 
    { 
     class Program 
     { 
      static void Main(string[] args) 
      { 
       var dTable = new DataTable(); 
       dTable.Columns.Add("Title"); 
       dTable.Columns.Add("Artist"); 
       dTable.Columns.Add("Album"); 

       dTable.Rows.Add("Baby one more time", "Britney Spears", "Baby one more time"); 
       dTable.Rows.Add("Crazy", "Britney Spears", "Best of"); 
       dTable.Rows.Add("Every time", "Britney Spears", "Best of"); 
       dTable.Rows.Add("Black and White", "Michael Jackson", "Best of"); 
       dTable.Rows.Add("You are not alone", "Michael Jackson", "Best of"); 
       dTable.Rows.Add("Smile", "Michael Jackson", "Best of"); 

       var query = dTable.AsEnumerable(). 
        GroupBy(row => row.Field<string>("Artist")). 
        Select(
         (grp, i) => new XElement("Artist", 
          new XAttribute("ID", i + 1), 
          new XAttribute("ARTISTNAME", grp.Key), 
           grp.Select(song => new XElement("SONG", 
            new XAttribute("artistID", i + 1), 
            new XAttribute("title", song.Field<string>("Title")), 
            new XAttribute("album", song.Field<string>("Album")) 
            ) 
           ) 
         ) 
        ); 

       var xml = new XElement("Music", query); 
      } 
     } 
    } 
+0

谢谢xeondev .........这是很好,我可以转换为vb。净成功和测试..我非常需要它,我真的很感激你的帮助。非常感谢。 – lawphotog

+0

不客气。 –

+0

嗨xeondev,请帮我一个忙。是否有可能将SONGID作为属性添加到歌曲元素中。从第一首歌曲开始,以1开始,直到最后一首歌曲增加1,直到没有进入艺术家的作品。非常谢谢你,我按计划跑步,我非常需要它。 – lawphotog

0

您可以使用dotnet类型的数据集。 该数据集有方法来加载和保存其内容从/到XML。

这个xsd会为你提供所需的带有自动增量id-s嵌套子表和xml属性的xml格式,而不是表格字段的xml-elements。

将此项目添加到项目中,并从中生成一个类型化的数据集。

<xs:schema id="Music" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:msprop="urn:schemas-microsoft-com:xml-msprop"> 
     <xs:element name="Music" msdata:IsDataSet="true" msdata:Locale="en-US"> 
     <xs:complexType> 
      <xs:choice minOccurs="0" maxOccurs="unbounded"> 
      <xs:element name="Artist"> 
       <xs:complexType> 
       <xs:sequence> 
        <xs:element name="Song" minOccurs="0" maxOccurs="unbounded"> 
        <xs:annotation> 
         <xs:appinfo> 
          <msdata:Relationship name="SongsOfArtist" msdata:parent="Artist" msdata:child="Song" msdata:parentkey="ID" msdata:childkey="artistid" msprop:Generator_UserRelationName="SongsOfArtist" msprop:Generator_RelationVarName="relationSongsOfArtist" msprop:Generator_UserChildTable="Song" msprop:Generator_UserParentTable="Artist" /></xs:appinfo></xs:annotation> 
        <xs:complexType> 
         <xs:attribute name="SongID" msdata:AutoIncrement="true" msdata:AutoIncrementSeed="1" type="xs:long" msdata:AllowDBNull="false" use="prohibited" /> 
         <xs:attribute name="artistid" msdata:AutoIncrementSeed="1" type="xs:long" use="required" /> 
         <xs:attribute name="title" msprop:DateTimeMode="UnspecifiedLocal" type="xs:string" /> 
         <xs:attribute name="album" msprop:DateTimeMode="UnspecifiedLocal" type="xs:string" /> 
        </xs:complexType> 
        </xs:element> 
       </xs:sequence> 
       <xs:attribute name="ID" msdata:AutoIncrement="true" msdata:AutoIncrementSeed="1" type="xs:long" use="required" /> 
       <xs:attribute name="ARTISTNAME" msprop:DateTimeMode="UnspecifiedLocal" type="xs:string" /> 
       </xs:complexType> 
      </xs:element> 
      </xs:choice> 
     </xs:complexType> 
     <xs:unique name="Song_Constraint1" msdata:ConstraintName="Constraint1"> 
      <xs:selector xpath=".//Song" /> 
      <xs:field xpath="@SongID" /> 
     </xs:unique> 
     <xs:unique name="Constraint2"> 
      <xs:selector xpath=".//Song" /> 
      <xs:field xpath="@artistid" /> 
     </xs:unique> 
     <xs:unique name="Constraint1"> 
      <xs:selector xpath=".//Artist" /> 
      <xs:field xpath="@ID" /> 
     </xs:unique> 
     <xs:keyref name="SongsOfArtist" refer="Constraint1" msdata:IsNested="true"> 
      <xs:selector xpath=".//Song" /> 
      <xs:field xpath="@artistid" /> 
     </xs:keyref> 
     </xs:element> 
    </xs:schema> 

如果vs2010 xsd编辑器仍然支持此文件中的所有xsd设置,我不确定。如果您使用vs 2010编辑它,使用vs2003-xsd编辑器可以使Maybes某些设置丢失。

+0

感谢您的帮助.. – lawphotog