Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C#解析XML字符串并将其转换为对象列表?_C#_Xml - Fatal编程技术网

使用C#解析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> <

我有以下XML字符串:

<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");