2008-09-09 29 views
6

我被給了一個.xml文件,我需要將其作爲DataSet讀入我的代碼中(作爲背景,該文件是通過在C#中創建DataSet創建的,並調用dataSet.WriteXml(file, XmlWriteMode.IgnoreSchema),但這已完成由別人)。將XML文件讀入C#DataSet的問題

.xml文件的形狀像這樣:

<?xml version="1.0" standalone="yes"?> 
<NewDataSet> 
    <Foo> 
    <Bar>abcd</Bar> 
    <Foo>efg</Foo> 
    </Foo> 
    <Foo> 
    <Bar>hijk</Bar> 
    <Foo>lmn</Foo> 
    </Foo> 
</NewDataSet> 

使用C#和.NET 2.0,我在使用下面的代碼讀取的文件:

 DataSet ds = new DataSet(); 
     ds.ReadXml(file); 

使用斷點,在此之後line ds.Tables[0]這個樣子(使用到位下劃線破折號,我不能得到正確格式):

Bar  Foo-Id Foo-Id-0 
abcd  0   null 
null  1   0 
hijk  2   null 
null  3   2 

我找到了一個解決方法(我知道有很多),並且已經能夠在.xml中成功讀取,但是我想了解爲什麼ds.ReadXml(file)以這種方式執行,所以我將能夠避免在未來。謝謝。

回答

4

這似乎爲您嵌套富標籤是正確的:

<NewDataSet> 
    <Foo>    <!-- Foo-Id: 0 --> 
    <Bar>abcd</Bar> 
    <Foo>efg</Foo> <!-- Foo-Id: 1, Parent-Id: 0 --> 
    </Foo> 
    <Foo>    <!-- Foo-Id: 2 --> 
    <Bar>hijk</Bar> 
    <Foo>lmn</Foo> <!-- Foo-Id: 3, Parent-Id: 2 --> 
    </Foo> 
</NewDataSet> 

所以這個正確變爲4條記錄在你的結果,與父子鍵「富-ID-0」

嘗試:

<NewDataSet> 
    <Rec>    <!-- Rec-Id: 0 --> 
    <Bar>abcd</Bar> 
    <Foo>efg</Foo> 
    </Rec> 
    <Rec>    <!-- Rec-Id: 1 --> 
    <Bar>hijk</Bar> 
    <Foo>lmn</Foo> 
    </Rec> 
</NewDataSet> 

應結果,其中:

Bar  Foo  Rec-Id 
abcd efg  0 
hijk lmn  1 
0

這是我的意見,而不是一個完整的答案:

我的猜測(但不嘗試重新產生它自己)是一對夫婦的事情可能會發生的數據集試圖「扁平化」的層次結構到關係數據結構。

1)從關係數據庫的角度思考數據;沒有明顯的主鍵字段用於標識集合中的每個Foo元素,因此DataSet已自動將文件中的序號位置用作自動生成的名爲Foo-Id的字段。

2)實際上有兩個名爲'Foo'的元素,所以可能解釋爲'Foo-Id-0'列生成一個奇怪的名稱(它爲列自動生成了一個唯一的名稱 - 我想您可以將其視爲DataSet中的容錯行爲)。