簡體   English   中英

需要幫助將DataTable轉換為XML VB.NET

[英]Need help converting DataTable to XML VB.NET

我需要將DataTable轉換為XML的幫助。 我已經使用LINQ做到了,但是我不能完全做到。 我做了一張照片,以便您可以輕松理解。 XML必須采用以下特定格式,因此我不能僅使用dt.writexml()。 藝術家ID需要自動編號。 歌曲按藝術家分組。 在Linq coz中更喜歡一個解決方案,這是我在整個項目中一直使用的解決方案,但我無法在這里得到想要的解決方案。 列名是已知的,因此您可以在代碼中使用類似的名稱。 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並進行分組,但仍將song元素中的album =“ 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))))

希望您可以將其轉換為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);
            }
        }
    }

您可以為此使用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設置。 如果使用vs 2010進行編輯,可能會丟失某些設置。使用vs2003-xsd編輯器可以正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM