【问题标题】:Need help converting DataTable to XML VB.NET需要帮助将 DataTable 转换为 XML VB.NET
【发布时间】:2012-05-16 17:13:28
【问题描述】:

我需要帮助将 DataTable 转换为 XML。我已经使用 LINQ 完成了它,但我无法完全按照我的要求完成。我做了一张图片,以便您可以轻松理解。 XML 需要采用某种格式,如下所示,所以我不能只使用 dt.writexml()。艺术家 ID 需要自动编号。歌曲按艺术家分组。更喜欢 Linq 中的解决方案,因为这是我在整个项目中使用的,但我无法在这里得到我想要的。列名是已知的,因此您可以在代码中使用类似的内容。 row.Field(Of String)("title")

非常感谢。我是认真的。抱歉英语不好。

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 并进行分组,但在歌曲元素中仍然具有专辑 =“albumname”作为属性。它应该只是从数据表到 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))))

【问题讨论】:

  • 如果您提供创建示例数据表的代码,我们会更容易提供帮助。
  • 谢谢家伙..我编辑了帖子..请看。
  • 我误解了蒂姆的评论,我在第一个示例中添加了一些代码来创建一个简单的数据表谢谢

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


【解决方案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);
            }
        }
    }

【讨论】:

  • 感谢 xeondev ......这太棒了,我可以成功转换为 vb.net 并经过测试.. 我非常需要它,非常感谢您的帮助。非常感谢。
  • 嗨,xeondev,请帮我一个忙..是否可以将 SONGID 作为属性添加到歌曲元素..从第一首歌曲开始,每首歌曲增加 1,直到最后一首歌曲不考虑艺术家。非常感谢 xeondev,我已经超期了,我非常需要它。
  • 我刚刚在 DataTable 中添加了一个列,然后它才进入 Linq。它完成了这项工作。谢谢:D
【解决方案2】:

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

此 xsd 将为您提供所需的 xml 格式,其中包含自动增量 id-s 嵌套子表和 xml-attributes 而不是表字段的 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 编辑器它可以工作。

【讨论】:

    猜你喜欢
    • 2021-11-06
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多