2012-05-08 13 views
2

DataTableをXMLに変換するための助けが必要です。私はLINQを使用してそれを行っていますが、私は正確に私が持っているように得ることはできません。私はあなたが容易に理解できるように絵を描いた。 XMLは以下のような特定の形式にする必要があるので、dt.writexml()を使うことはできません。アーティストIDは自動番号にする必要があります。曲はアーティストによってグループされています。私がプロジェクト全体で使ってきたLinq cozの解決法を好むが、ここで私が望むものを得ることはできない。列の名前は既知であるため、コード内でこのようなものを使用できます。フィールド(文字列)( "タイトル")DataTableをXMLに変換する際の助けが必要です。VB.NET

ありがとうございます。私は真剣です。英語が苦手な人には申し訳ありません。

enter image description here

CreateDatatable - この単純なコードでは、私が現時点で持っているもののDataTable

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

を作成する必要があります。それはgrouppingとアルバムのインデックスなしでdatatableを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」を有するます。そして、それはdatatableから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)))) 
+0

に変換することができます願っています。 –

+0

ありがとうございました..投稿を編集しました。ご覧ください。 – lawphotog

+0

私の助けのためのティムさんのコメントを誤解し、私は私の最初の例のように、単純なデータテーブルを作成するために、いくつかのコードを入れおかげ – lawphotog

答えて

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); 
      } 
     } 
    } 
+0

おかげでxeondev .........これはbrillientであり、私はVBに変換することができます。ネットは正常にテストされました。私は必死にそれを必要としており、本当にあなたの助けに感謝しています。どうもありがとう。 – lawphotog

+0

ようこそ。 –

+0

こんにちはxeondev、私は好きですか?私は賛成をお願いします。曲の要素に属性としてSONGIDを追加することは可能ですか?最初の曲から1で始まり、最後の曲まで各曲に1ずつ増加します。私はそれを必要としています。 – lawphotog

0

これには、ドットネット型のデータセットを使用できます。 データセットには、そのコンテンツをXMLから読み込んでXMLに保存するメソッドがあります。

このxsdは、autoincrement id-sネストされたサブテーブルとxml-attributesを持つxml-formatを、テーブルフィールドの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-の設定をサポートしている場合、私はSHUREないです。あなたがvs2003-xsdエディタを使ってそれを編集するとMaybesの設定が失われることがあります。

+0

おかげで... – lawphotog

関連する問題