我正在尝试使用.net 4.0 / c#
从以下xml文档创建业务对象的集合 <WebServices ErrorFound="False" ServerDateTime="30/11/2010 14:58:58">
<Results>
<Users TotalResults="5">
<UserName UserID="2">John</UserName>
<UserName UserID="3">Dave</UserName>
<UserName UserID="4">Jim</UserName>
<UserName UserID="5">Bob</UserName>
</Users>
</Results>
</WebServices>
这是我需要创建的课程
public class User
{
public string Name { get; set; }
public int ID { get; set; }
}
每个Users子元素都应该是该类的新实例。 到目前为止,我有这个接受XmlDocument的方法。
public static IEnumerable<User> GetUser(XmlDocument xmlDoc)
{
XmlReader reader = XmlReader.Create(new StringReader(xmlDoc.OuterXml));
XDocument doc = XDocument.Load(reader);
var user = from u in doc.Descendants("WebServices").DescendantsAndSelf("Users")
select new User()
{
Name = u.Element("UserName").Value,
ID = int.Parse(u.Element("UserName").Attribute("UserID").Value)
};
List<User> userInstance = user.ToList();
IEnumerable<User> users= from u in userInstance
select u;
return users;
}
就第一个子元素生成一个对象实例而言,这很好用,但我不确定如何从所有元素创建多个实例。
我需要能够返回User对象的集合,例如Collection<User> users = new Collection<User>()
我可能完全咆哮着错误的树。非常感谢任何帮助。
答案 0 :(得分:1)
使用XPath,您可以编写如下代码:
public class User
{
public string Name { get; set; }
public int ID { get; set; }
}
static void Main(string[] args)
{
string xml =
"<WebServices ErrorFound='False' ServerDateTime='30/11/2010 14:58:58'>" +
"<Results>" +
"<Users TotalResults='5'>" +
"<UserName UserID='2'>John</UserName>" +
"<UserName UserID='3'>Dave</UserName>" +
"<UserName UserID='4'>Jim</UserName>" +
"<UserName UserID='5'>Bob</UserName>" +
"</Users>" +
"</Results>" +
"</WebServices>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
var users = from userNameElement in doc.SelectNodes("/WebServices/Results/Users/UserName").OfType<XmlElement>()
select new User
{
Name = userNameElement.InnerText,
ID = Int32.Parse(userNameElement.GetAttribute("UserID"))
};
foreach (var user in users)
{
Console.WriteLine(user.ID.ToString() + ": " + user.Name);
}
}
答案 1 :(得分:1)
好的,所以我终于弄清楚我的代码出了什么问题。 而不是
var user = from u in doc.Descendants("WebServices").DescendantsAndSelf("Users")
select new User()
{
Name = u.Element("UserName").Value,
ID = int.Parse(u.Element("UserName").Attribute("UserID").Value)
};
我现在有
var user = (from u in doc.Descendants("UserName")
select new Provider()
{
Name = u.Value,
ID = int.Parse(u.Attribute("UserID").Value)
});
声明:doc.Descendants("UserName")
基本上生成一个可以迭代的UserName元素数组,然后我可以直接访问该元素的值并将其设置为我的类属性。