2015-08-24 131 views
0

這裏是我的XML:C#DataSet.ReadXml()省略了一些列

<notebooks> 
    <notebook> 
     <is-default type="boolean">true</is-default> 
     <name>James's notebook</name> 
     <id>MS4zfDEvMS9Ob3RlYm9va3wzLjM=</id> 
    </notebook> 
    <notebook> 
     <is-default type="boolean">false</is-default> 
     <name>James alternate notebook</name> 
     <id>NDQuMnwzNC8zNC9Ob3RlYm9va3wxMTIuMg==</id> 
    </notebook> 
    <notebook> 
     <is-default type="boolean">false</is-default> 
     <name>Notebook for James lab</name> 
     <id>NTMuM3w0MS80MS9Ob3RlYm9va3wxMzUuMw==</id> 
    </notebook> 
    </notebooks> 

,我這樣做,我發現這裏的標準數據集負載:

DataSet ds = new DataSet(); 
    ds.ReadXml(new StringReader(lcXMLSegment)); 

事情做工精細,除了「筆記本」表僅以列「名稱」和「ID」結束。除非我從每個元素中移除type =「boolean」,否則「is-default」列不會通過。

我試圖在執行ReadXml()之前創建一個DataTable模式,但這並沒有做任何事情,因爲我假設DataSet.ReadXml()重新創建數據集內的表。我還嘗試了ReadXml()上的各種第二個參數來讀取或推斷模式,並沒有區別(或引發錯誤)。

這個XML是從我想訪問的web API返回的,並根據自定義編程,所以我無法控制XML的本地結構。任何幫助將不勝感激,告訴我我失蹤了。我很好,如果「is-default」字段不能作爲類型布爾值來拉入,因爲我可以處理所有字符串類型的數據。我也很好地爲從XML載入的任何數據創建完整模式,但我不知道在這種情況下我會在哪裏或如何做。

謝謝!

+0

在這種情況下,DataSet.ReadXml返回2個表。帶有'name'和'id'列的表[0]。和列[type]和'is-default_Text'的表[1]。 –

+0

謝謝!這有幫助!我已經採取了使用Replace()從標籤中刪除任何「無關的」屬性。任何方式來告訴ReadXml()忽略那些東西?我想我可以使用表1中的數據將列添加回表0,但這聽起來像是一種痛苦。雖然可能我應該學習的東西。 – sutekh137

回答

1

如果你真的不需要這個屬性,它可以如下去除:

XElement xml = XElement.Parse(lcXMLSegment); 
// or load from file: .Load("file.xml"); 

xml.Elements("notebook") 
    .Elements("is-default") 
    .Attributes("type") 
    .Remove(); 

使用類來處理XML像LinqToXml比通過使用像Replace字符串的方法更合適的方式。

然後直接從的XElement讀取數據:

DataSet ds = new DataSet(); 

using (var reader = xml.CreateReader()) 
    ds.ReadXml(reader); 
+0

謝謝亞歷山大。我將來會嘗試使用更多的LINQ。現在我只是敲這個應用程序了。但是我從你身上學到的東西比迄今爲止我所做的更多。 *微笑* – sutekh137

0

對這個問題的另一種方法是預先準備的數據表;

DataSet ds = new DataSet(); 
DataTable dt = new DataTable("notebook"); 
dt.Columns.Add("is-default", typeof(bool)); 
dt.Columns.Add("name", typeof(string)); 
dt.Columns.Add("id", typeof(string)); 
ds.Tables.Add(dt); 

ds.ReadXml(new StringReader(lcXMLSegment));