2013-11-20 55 views
1

我正在編寫一個返回XML輸出的Web服務中的接口。通過調用存儲過程從MS SQL數據庫查詢輸出。雖然存儲過程本身沒有返回XML,但我沒有任何控制權,但我需要將結果集作爲XML返回。以XML格式返回存儲過程結果

現在,我正在使用XmlWriter。有沒有更容易,更優雅的方式來做到這一點?

 StringBuilder sbLog = new StringBuilder(); 
     XmlWriter writer = XmlWriter.Create(sbLog); 
     writer.WriteStartDocument(); 
     writer.WriteStartElement("LogSet"); 

     while (sqlRdr.Read()) 
     { 
      writer.WriteStartElement("Log"); 

      writer.WriteStartElement("EntryID"); 
      writer.WriteValue(sqlRdr["EntryID"].ToString()); 
      writer.WriteEndElement(); 

      //and so on 
+1

我想你可以使用DataSet,並從中直接獲取XML。 –

回答

0

是的XDocument可能是一個更乾淨的界面。這將是這個樣子:

var doc = new XDocument(
    new XElement("LogSet", 
     new XElement("EntryID", sqlRdr["EntryID"].ToString()), 
     new XElement(...) 
    ) 
); 

// save it to a file 
doc.Save(pathToDoc); 

// or just return it 
return doc.ToString(); 
0

我不知道它的優雅(我想這部分取決於你需要多少次重現這樣的事情在你的代碼),但我寫了一個XmlDataReader後來將IDataReader中的表格數據轉換爲Xml結果,而無需創建輔助文檔/字符串。由於WebServices可以返回XmlNode(而不是XmlReader),因此第二個類XmlNodeFactory可以執行該轉換。

這裏是the Gist for XmlDataReader 而對於the XmlNodeFactory

用法是一樣的東西:

[WebMethod] 
public XmlNode GetFeaturedItems(string storeId) 
{ 
    var xmlReader = new XmlDataReader( 
     _db.GetFeaturedItems(storeId), 
     MyXmlNames.FeaturedItemsNamespace) 
     { 
      IncludeIndexField = false, 
      IncludeResultLevel = false, 
      RootElementName = "FeaturedItems", 
      RowElementNameFormat = "Item" 
     }; 

    return XmlNodeFactory.Create(xmlReader);  
}