2012-05-08 2 views
2

DataTable을 XML로 변환하는 데 도움이 필요합니다. 나는 LINQ를 사용하여 그것을 해왔지만 정확하게 할 수는 없다. 나는 당신이 쉽게 이해할 수 있도록 그림을 그렸다. XML은 아래처럼 특정 형식이어야하므로 dt.writexml()을 사용할 수 없습니다. 아티스트 ID는 자동 전화 번호 여야합니다. 노래는 아티스트에 의해 groupped 있습니다. Linq coz의 솔루션을 선호합니다. 내가이 프로젝트에서 사용했던 솔루션이지만, 원하는 것을 얻을 수는 없습니다. 열 이름은 알려져 있으므로 코드에서 이와 같은 것을 사용할 수 있습니다. 문자열 (Of String) ("제목")DataTable을 XML로 변환하는 데 도움이 필요합니다.

고마워요. 진심이야. 가난한 영어에 대한 죄송합니다.

enter image description here

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

을 만들어야합니다. 그것은 groupping 및 앨범 인덱스없이 XML로 datatable을 변환합니다.

 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에 이르는 하나의 쿼리 여야합니다. xml을 다시 쿼리하여 다시 리팩토하는 것을 싫어합니다. 당신이 DOTNET을 사용할 수 있습니다

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

Tim의 코멘트를 잘못 이해했습니다. 첫 번째 예와 같이 간단한 데이터 테이블을 생성하는 코드를 작성했습니다. 감사합니다. – 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 .........이 글은 화려하며 VB로 변환 할 수 있습니다. 그물을 성공적으로 테스트하고 .. 필사적으로 필요로하고 정말로 도움을 주셔서 감사합니다. 고마워. – lawphotog

+0

당신을 진심으로 환영합니다. –

+0

안녕하세요 xeondev, 제발 부탁을 들어주세요. 노래 요소에 특성으로 SONGID를 추가 할 수 있습니까? 첫 번째 노래부터 1시에 시작하여 마지막 노래까지 각 노래에 1 씩 증가하여 아티스트의 도움을받지 않습니다. 너무 많은 xeondev 감사합니다, 나는 필사적으로 그것을 필요로하는 일정에 따라 달리고있다. – lawphotog

0

이에 대한 데이터 집합을 입력했습니다. 데이터 세트에는 XML에서 콘텐츠를로드하고 XML에 저장하는 메소드가 있습니다.

이 xsd는 autoincrement id-s 중첩 서브 테이블과 xml-attributes를 사용하여 원하는 xml 형식을 제공합니다.

프로젝트에 이것을 추가하고 입력 된 데이터 세트를 생성하십시오.

<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가 아닙니다. Maybes vs2003-xsd 편집기로 편집하면 몇 가지 설정이 손실됩니다.

+0

도움을 주셔서 감사합니다. – lawphotog

관련 문제