2009-04-17 3 views
1

데이터 세트에 다음 중첩 XML을로드하려면 어떻게해야합니까?데이터 세트에 중첩 된 XML로드

<items> 
    <item> 
    <id>i1</id> 
    <name>item1</name> 
    <subitems> 
    <name>subitem1</name> 
    <name>subitem2</name> 
    </subitems> 
    </item> 
    <item> 
    <id>i2</id> 
    <name>item2</name> 
    <subitems> 
    <name>subitem1</name> 
    <name>subitem2</name> 
    </subitems> 
    </item> 
</items> 

"항목"표까지 올릴 수 있지만 하위 항목은 어떻게 구할 수 있습니까?

MemoryStream itemsStream = new MemoryStream(Encoding.ASCII.GetBytes(itemsXML)); 
DataSet itemsSet = new DataSet(); 
itemsSet.ReadXml(itemsStream); 
foreach (DataRow itemRow in itemsSet.Tables["item"].Rows) { 
    Console.WriteLine("column id=" + itemRow["id"] as string + " name=" + itemRow["name"] as string); 
} 
+0

그것의 아주 쉽게 ds.Tables[0]ds.Tables[1]를 사용하여 아래 뒤로 링크 기사를 따라야 . NET 3.5 FX는 Linq를 사용하여 XML, 어느 하나를 사용하고 있습니까 ?? –

+0

XML을 Linq로 사용하는 것이 쉬운 방법이 있다면 3.5을 사용하고 있습니다. – sipwiz

답변

2

이것은 나를 위해 일하는 유일한 자유는 하위 항목의 필드 이름을 변경하는 것입니다. 하위 항목 여기

<subitems> 
     <name1>subitem1</name1> 
     <name2>subitem2</name2> 
    </subitems> 

에 대한 하위 항목

<subitems> 
    <name>subitem1</name> 
    <name>subitem2</name> 
    </subitems> 

수정 된 XML에 대한

원본 XML 코드입니다.

 DataSet myDS = new DataSet(); 
     DataTable myTable = new DataTable("item"); 
     myTable.Columns.Add("id", typeof(string)); 
     myTable.Columns.Add("name", typeof(string)); 
     myTable.Columns.Add("name1", typeof(string)); 
     myTable.Columns.Add("name2", typeof(string)); 

     myDS.Tables.Add(myTable); 

     string xmlData = "<items> <item> <id>i1</id> <name>item1</name> <subitems> <name1>subitem1</name1> <name2>subitem2</name2> </subitems> </item> <item> <id>i2</id> <name>item2</name> <subitems> <name1>subitem3</name1> <name2>subitem4</name2> </subitems></item></items>"; 
     System.IO.MemoryStream itemsStream = new System.IO.MemoryStream(Encoding.ASCII.GetBytes(xmlData)); 

     myDS.ReadXml(itemsStream, XmlReadMode.IgnoreSchema); 
     foreach (DataRow itemRow in myDS.Tables["item"].Rows) 
     { 
      MessageBox.Show("column id=" + itemRow["id"] + " name=" + itemRow["name"]); 
      MessageBox.Show(itemRow["name1"].ToString() + " - " + itemRow["name2"].ToString()); 
     } 
+0

고마워요. 내가 쫓아 오는 것에 대해 매우 가까와서 지금 당장 그 메커니즘을 이해합니다. – sipwiz

0

데이터 세트 ReadXml을 사용하십시오. 예를 들어

http://msdn.microsoft.com/en-us/library/7sfkwf9s(v=VS.100).aspx

:

당신이 테이블을 읽을 수 물론
DataSet ds = new DataSet(); 
ds.ReadXml(new StringReader(nestedXml)); 
StringBuilder sb = new StringBuilder(); 
ds.WriteXml(new StringWriter(sb)); 
Response.Write(sb.ToString()); 

개별적으로

0
String sss = @"<items> 
<item> 
    <id>i1</id> 
    <name>item1</name> 
    <subitems> 
    <name>subitem1</name> 
    <name>subitem2</name> 
    </subitems> 
    </item> 
    <item> 
    <id>i2</id> 
    <name>item2</name> 
     <subitems> 
     <name>subitem1</name> 
     <name>subitem2</name> 
     </subitems> 
    </item> 
    </items>"; 

StringReader rr = new StringReader(sss); 
DataSet sdread = new DataSet(); 
sdread.ReadXml(rr);