使用C#解析XML字符串并将其转换为对象列表?
我有以下XML字符串:使用C#解析XML字符串并将其转换为对象列表?,c#,xml,C#,Xml,我有以下XML字符串: <rows> <row> <id> <old>2125</old> </id> <name> <old>test</old> </name> <amount> <old>62</old> </amount> <
<rows>
<row>
<id>
<old>2125</old>
</id>
<name>
<old>test</old>
</name>
<amount>
<old>62</old>
</amount>
</row>
</rows>
其中,字段
将包含此格式的上述行:
id|2125^name|text^amount|62
我相信在你的情况下,XmlSerialization就是你要寻找的。下面是一个例子:
namespace consoleApp {
[XmlRoot()]
public class EventInput {
private string group;
public string Group {
get { return group; }
set { group = value; }
}
private Event[] events;
public Event[] Events {
get { return events; }
set { events = value; }
}
}
public class Event {
private int id;
[XmlAttribute]
public int Id {
get { return id; }
set { id = value; }
}
}
class Program {
public static void Main() {
string xml = @"
<EventInput>
<Group>12345</Group>
<Events>
<Event Id=""100"" />
<Event Id=""101"" />
<Event Id=""102"" />
<Event Id=""103"" />
<Event Id=""104"" />
</Events>
</EventInput>";
XmlSerializer serializer = new XmlSerializer(typeof(EventInput));
EventInput ei = (EventInput)serializer.Deserialize(new StringReader(xml));
Console.WriteLine(ei.Group);
foreach(Event e in ei.Events) {
Console.WriteLine(e.Id);
}
Console.WriteLine("\n=============================\n");
ei = new EventInput() {
Group = "1111",
Events = new Event[] {
new Event() { Id = 3},
new Event() { Id = 7},
new Event() { Id = 10}}
};
serializer.Serialize(Console.Out, ei);
}
}
}
namespace consoleApp{
[XmlRoot()]
公共类EventInput{
私有字符串组;
公共字符串组{
获取{返回组;}
设置{group=value;}
}
私人事件[]事件;
公共事件[]事件{
获取{返回事件;}
设置{events=value;}
}
}
公共类事件{
私有int-id;
[XmlAttribute]
公共整数Id{
获取{return id;}
设置{id=value;}
}
}
类程序{
公共静态void Main(){
字符串xml=@“
12345
";
XmlSerializer serializer=新的XmlSerializer(typeof(EventInput));
EventInput ei=(EventInput)序列化程序。反序列化(新的StringReader(xml));
控制台写入线(ei组);
foreach(ei.Events中的事件e){
控制台写入线(e.Id);
}
Console.WriteLine(“\n========================================\n”);
ei=新的EventInput(){
Group=“1111”,
事件=新事件[]{
新事件(){Id=3},
新事件(){Id=7},
新事件(){Id=10}
};
serializer.Serialize(Console.Out,ei);
}
}
}
对于更复杂的xml文档(如果您有模式),可以使用xsd.exe为您自动生成类层次结构。有关XmlSerialization属性的更多详细信息,请查看以下内容:
希望这对使用LINQtoXML和一些foreach循环有所帮助,您可以尝试以下方法
var str = @"<rows>
<row>
<id>
<old>2125</old>
</id>
<name>
<old>test</old>
</name>
<amount>
<old>62</old>
</amount>
</row>
</rows>";
var elements = XElement.Parse(str);
var rows = elements.Elements("row");
var list = new List<Row>();
foreach(var row in rows)
{
var id = Int32.Parse(row.Element("id").Element("old").Value);
var name = row.Element("name").Element("old").Value;
var amount = row.Element("amount").Element("old").Value;
var fields = string.Format("id|{0}^name|{1}^amount|{2}",id, name, amount);
list.Add(new Row { Id = id, Fields = fields});
}
}
var str=@”
2125
测试
62
";
var elements=XElement.Parse(str);
变量行=元素。元素(“行”);
var list=新列表();
foreach(行中的变量行)
{
var id=Int32.Parse(row.Element(“id”).Element(“old”).Value);
变量名称=行。元素(“名称”)。元素(“旧”)。值;
var金额=行元素(“金额”).元素(“旧”)值;
var fields=string.Format(“id{0}^name{1}^amount{2}”,id,name,amount);
添加(新行{Id=Id,Fields=Fields});
}
}
Linq本身无法做到这一点,但如果使用XMLDocument或其他XML解释器将XML解析为对象集合,则可以使用Linq读取集合
所以
您是否强制使用LINQ?请参阅LINQtoXML:到目前为止,我只是使用
var Xml=XDocument.Parse阅读Xml代码>。如果我可以在CLR函数中使用Linq,那么使用Linq就不是问题。您可以通过使用LinqToXML将XML加载到POCO类:请参阅序列化也适用于自动属性。你可以考虑使用它们。这与斯卡特的答案基本相同,但使用LINQ而不是Frach循环。
var str = @"<rows>
<row>
<id>
<old>2125</old>
</id>
<name>
<old>test</old>
</name>
<amount>
<old>62</old>
</amount>
</row>
</rows>";
var elements = XElement.Parse(str);
var rows = elements.Elements("row");
var list = new List<Row>();
foreach(var row in rows)
{
var id = Int32.Parse(row.Element("id").Element("old").Value);
var name = row.Element("name").Element("old").Value;
var amount = row.Element("amount").Element("old").Value;
var fields = string.Format("id|{0}^name|{1}^amount|{2}",id, name, amount);
list.Add(new Row { Id = id, Fields = fields});
}
}
var rows = from d in xmlDoc.ChildNodes
where d.Name = "row"
select new {id= d.Attributes.FirstOrDefault(a=>a.Name=="id"),Other=d.Attributes.Where(a=>a.Name!="id");