关于asp.net:需要帮助将DataTable转换为XML VB.NET

Need help converting DataTable to XML VB.NET

我需要帮助将DataTable转换为XML。我已经使用LINQ做到了,但是我无法完全达到我的要求。我拍了张照片,以便您可以轻松理解。 XML必须采用以下特定格式,因此我不能仅使用dt.writexml()。艺术家ID需要自动编号。歌曲按艺术家分组。在Linq coz中更喜欢一个解决方案,这是我在整个项目中一直使用的解决方案,但是我无法在这里得到想要的解决方案。列名是已知的,因此您可以在代码中使用类似的名称。 row.Field(字符串)("标题")

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

enter

1
2
3
4
5
6
7
8
9
10
11
            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。

1
2
3
4
5
6
7
8
      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并进行分组,但仍将song元素中的album = " albumname "作为属性。它应该只是从数据表到xml的一个查询。我讨厌不得不再次针对xml进行查询以重新格式化它。

1
2
3
4
5
6
    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))))


希望您可以将其转换为VB.NET

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
    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);
            }
        }
    }


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

此xsd将为您提供所需的xml格式,其中包含自动递增的id-s嵌套子表和xml-attributes,而不是tablefields的xml-elements。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
    <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编辑器可以正常工作。