2

DataTable を XML に変換するのに助けが必要です。私はLINQを使用してそれを行いましたが、私がしなければならない通りに正確に取得することはできません. わかりやすいように絵を描いてみました。XML は以下のような特定の形式である必要があるため、dt.writexml() だけを使用することはできません。アーティスト ID は自動採番が必要です。曲はアーティストごとにグループ化されています。プロジェクト全体で使用したLinq cozのソリューションを好みますが、ここで必要なものを手に入れることができませんでした。列名は既知であるため、コードでこのようなものを使用できます。row.Field(Of String)("タイトル")

どうもありがとう 。私は真剣です。下手な英語でごめんなさい。

ここに画像の説明を入力

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"をまだ持っています。そして、それはデータテーブルからxmlへの1つのクエリである必要があります..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))))
4

2 に答える 2

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);
            }
        }
    }
于 2012-05-08T10:43:48.110 に答える
0

これには dotnet 型のデータセットを使用できます。データセットには、xml との間でコンテンツをロードおよび保存するメソッドがあります。

この xsd は、テーブルフィールドの xml-elements の代わりに、自動インクリメント ID-s ネストされたサブテーブルと xml-attributes を使用して、目的の xml-format を提供します。

これをプロジェクトに追加し、そこから型指定されたデータセットを生成します。

    <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 エディターで動作します。

于 2012-05-08T09:00:35.633 に答える