需要帮助将DataTable转换为XML VB.NET

时间:2012-05-08 08:07:21

标签: asp.net xml vb.net linq datatable

我需要帮助将DataTable转换为XML。我使用LINQ完成了它,但我不能完全按照我的要求完成。我拍了一张照片让你很容易理解。 XML需要采用如下所示的格式,因此我不能只使用dt.writexml()。艺术家ID需要自动编号。歌曲由艺术家分组。喜欢Linq coz中的解决方案,这是我在整个项目中使用的,但我没有设法得到我想要的东西。列名称是已知的,因此您可以在代码中使用这样的内容。 row.Field(Of String)(“title”)

非常感谢。我是认真的。抱歉英语很差。

enter image description here

CreateDatatable - 这个简单的代码应该创建一个数据表

            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并进行分组,但仍然将歌曲元素中的album =“albumname”作为属性。它应该只是从datatable到xml的一个查询..我讨厌再次查询xml只是重新映射它。

    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))))

2 个答案:

答案 0 :(得分: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);
            }
        }
    }

答案 1 :(得分:0)

您可以使用dotnet类型的数据集。 数据集具有从/向xml加载和保存其内容的方法。

这个xsd将为您提供所需的xml格式,其中包含autoincrement id-s嵌套子表和xml-attributes,而不是tablefields的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-settings,那么我并不感到害羞。如果使用vs 2010编辑它,Maybes会丢失一些设置。使用vs2003-xsd编辑器可以正常工作。