我正在Web服务中编写一个返回XML输出的接口。通过调用存储过程从MS SQL数据库查询输出。虽然存储过程本身不返回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
答案 0 :(得分: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();
答案 1 :(得分: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);
}