Design Strongly typed object from XML
目前,我们基于“SQL XML”运行存储过程,其中我们send xml string
作为存储过程的输入,并从存储过程获取响应xml
。有关用户登录应用程序的简单演示,请执行以下操作
<Request Type="" CRUD="C/R/U/D">`
<Users>
<UserName></UserName>
<Password></Password>
</Users>
</Request>
不介意数据库的响应因为我们可以改变我们想要的任何东西。正是这种xml的构造让我们觉得太吓人了。以下是我们遵循的代码
StringBuilder _sbXml = new StringBuilder();
_sbXml.AppendLine("<Request Type='' CRUD=''>");
_sbXml.AppendLine("<Users>");
_sbXml.AppendLine("<UserName>"+ usernameVariable +"</UserName>");
_sbXml.AppendLine("<Password>"+ passwordVariable +"</Password>");
_sbXml.AppendLine("</Users>");
DataTier.BeginRequest(_sbXml.ToString());
我们尝试将事物抽象为方法,但我们再也没有解决过我们想要的问题,只是将它们隐藏在某个地方。
因此我们得出结论,每次请求都需要强类型 避免任何拼写错误,不良行为,避免手动编码xml和 维护
。因此问题
我如何抽象出这种构建xml的
XSD工具可以生成类建模xml数据(相关文章),是使用工具adaptive
长期生成的类吗?
建议将字符串xml抽象为Typed类吗?有没有人成功做过我现在想做的事情?你觉得哪个感觉舒服?
上面只是一个数据库调用,我们对所有数据库调用都一样。我们肯定会陷入困境。
使用C#2.0
.NET 2.0
SQL Server 2005
Visual Studio 2005
答案 0 :(得分:2)
这里有两个问题:
所以,我建议:
XmlDocument
等(它并不是很明确你的意思&#34;我们得出的结论是,课程会解决问题&#34;或者#34;我看到相关的帖子和生成的课程&#34;所以#&#34;所以#&#34; 39;我可能错过了这一点。如果是,请编辑你的问题以澄清。)
答案 1 :(得分:2)
我个人不建议在数据库中使用过多的xml;这是系统中最不可扩展的部分(你不能把它“廉价地”扩展出来),所以我不会花费所有时间来处理xml,而只是使用数据,数据输出 - 简单常规TSQL参数和网格。
然而!
构建xml的方法实际上非常错误 - 值应该是xml-escaped。但要回答这个问题 - 我会使用LINQ-to-XML(XElement
)或XmlSerializer。可能是后者,即
public class Request {
[XmlAttribute] public string Type {get;set;}
[XmlAttribute] public string CRUD {get;set;} // although I'd prefer an enum
public RequestUser Users {get;set;}
}
public class RequestUser {
public string UserName {get;set;}
public string Password {get;set;} // please use salted hash instead
}
然后:
var req = new Request { Type = "", CRUD = "",
Users = new RequestUser { UserName = username, Password = password } };
var ser = new XmlSerializer(typeof(Request));
StringWriter sw = new StringWriter();
ser.Serialize(sw, req);
string xml = sw.ToString();
我在这里看到的XmlSerializer(通过LINQ-to-XML)的主要优点是你可以 使用它来读回格式的xml ,通过Deserialize
。但是,LINQ-to-XML在这里也可以很好地工作:
var req = new XElement("Request",
new XAttribute("Type", ""),
new XAttribute("CRUD", ""),
new XElement("Users",
new XElement("UserName", username),
new XElement("Password", password)
)
);
var xml = req.ToString();