C# LINQ转换为XML。如何查询列表<;T>;使用Linq递归
我正在从结构生成XML文件。某些结构成员在C# LINQ转换为XML。如何查询列表<;T>;使用Linq递归,c#,xml,linq,xelement,C#,Xml,Linq,Xelement,我正在从结构生成XML文件。某些结构成员在列表中类型。我正在使用linq查询,但在某种程度上我被卡住了 我的结构如下所示: public struct Project { public string name; public List<Class> classes; } public struct Class { public string name; public int class_id; public List<Var> v
列表中
类型。我正在使用linq查询,但在某种程度上我被卡住了
我的结构如下所示:
public struct Project
{
public string name;
public List<Class> classes;
}
public struct Class
{
public string name;
public int class_id;
public List<Var> vars;
}
public struct Var
{
public string name;
public string description;
public int var_id;
public List<Element> elements;
}
public struct Element
{
public string name;
public string description;
public int element_id;
public List<Element> elements;
public List<Enm> enums;
}
public struct Enm
{
public string name;
public int value;
}
有没有一种简单的方法可以用最少的代码行来实现这一点?我认为必须有一种递归方法来解决我的问题。使用Xml序列化
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
namespace ConsoleApplication132
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
XmlWriter writer = XmlWriter.Create(FILENAME, settings);
XmlSerializer serializer = new XmlSerializer(typeof(Project));
Project project = new Project();
serializer.Serialize(writer, project);
}
}
[XmlRoot("PROJECT")]
public class Project
{
[XmlAttribute]
public string name { get; set; }
[XmlElement("CLASS")]
public List<cClass> classes { get; set; }
public Project()
{
name = "test project xml";
classes = new List<cClass>() {
new cClass() {
name = "class1",
class_id = 1,
vars = new List<Var>() {
new Var() {
name = "var name 1",
description = "var description",
var_id = 1,
elements = new List<Element>() {
new Element() {
name = "element name 1",
description = "element description",
element_id = 1
},
new Element() {
name = "element name 2",
description = "element description",
element_id = 2,
elements = new List<Element>() {
new Element() {
name = "element name 3",
description = "element description",
element_id = 3
}
}
},
new Element() {
name = "element name 4",
description = "element description",
element_id = 4,
elements = new List<Element>() {
new Element() {
name = "element name 5",
description = "element description",
element_id = 5,
elements = new List<Element>() {
new Element() {
name = "element name 6",
description = "element description",
element_id = 6
}
}
}
}
},
new Element() {
name = "element name 7",
description = "element description",
element_id = 7,
enums = new List<Enm>() {
new Enm() {
name = "option 1",
value = 1
},
new Enm() {
name = "option 2",
value = 2
},
new Enm() {
name = "option 3",
value = 3
}
}
}
}
},
new Var() {
name = "var name 2",
description = "var description",
var_id = 2,
elements = new List<Element>() {
new Element() {
name = "element name 8",
description = "element description",
element_id = 8
}
}
}
}
}
};
}
}
public class cClass
{
[XmlAttribute]
public string name { get; set; }
[XmlAttribute]
public int class_id;
[XmlElement("VAR")]
public List<Var> vars;
}
public class Var
{
[XmlAttribute]
public string name;
[XmlAttribute]
public string description;
[XmlAttribute]
public int var_id;
[XmlElement("ELEMENT")]
public List<Element> elements;
}
public struct Element
{
[XmlAttribute]
public string name;
[XmlAttribute]
public string description;
[XmlAttribute]
public int element_id;
[XmlElement("ELEMENT")]
public List<Element> elements;
[XmlElement("EMNU")]
public List<Enm> enums;
}
public struct Enm
{
[XmlAttribute]
public string name;
[XmlAttribute]
public int value;
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Serialization;
命名空间控制台应用程序132
{
班级计划
{
常量字符串文件名=@“c:\temp\test.xml”;
静态void Main(字符串[]参数)
{
XmlWriterSettings=新的XmlWriterSettings();
settings.Indent=true;
XmlWriter=XmlWriter.Create(文件名、设置);
XmlSerializer serializer=新的XmlSerializer(typeof(Project));
项目=新项目();
序列化器。序列化(编写器、项目);
}
}
[XmlRoot(“项目”)]
公共类项目
{
[XmlAttribute]
公共字符串名称{get;set;}
[XmlElement(“类”)]
公共列表类{get;set;}
公共工程()
{
name=“测试项目xml”;
类=新列表(){
新类别(){
name=“class1”,
class_id=1,
vars=新列表(){
新变量(){
name=“var name 1”,
description=“var description”,
var_id=1,
元素=新列表(){
新元素(){
name=“元素名称1”,
description=“元素描述”,
元素_id=1
},
新元素(){
name=“元素名称2”,
description=“元素描述”,
元素_id=2,
元素=新列表(){
新元素(){
name=“element name 3”,
description=“元素描述”,
元素_id=3
}
}
},
新元素(){
name=“element name 4”,
description=“元素描述”,
元素_id=4,
元素=新列表(){
新元素(){
name=“element name 5”,
description=“元素描述”,
元素_id=5,
元素=新列表(){
新元素(){
name=“element name 6”,
description=“元素描述”,
元素_id=6
}
}
}
}
},
新元素(){
name=“element name 7”,
description=“元素描述”,
元素_id=7,
enums=新列表(){
新Enm(){
name=“选项1”,
值=1
},
新Enm(){
name=“选项2”,
值=2
},
新Enm(){
name=“选项3”,
值=3
}
}
}
}
},
新变量(){
name=“var name 2”,
description=“var description”,
var_id=2,
元素=新列表(){
新元素(){
name=“element name 8”,
description=“元素描述”,
元素id=8
}
}
}
}
}
};
}
}
公共类
{
[XmlAttribute]
公共字符串名称{get;set;}
[XmlAttribute]
公共int class_id;
[XmlElement(“VAR”)]
公共列表变量;
}
公共类变量
{
[XmlAttribute]
公共字符串名称;
[XmlAttribute]
公共字符串描述;
[XmlAttribute]
公共内部变量id;
[XmlElement(“元素”)]
公共清单要素;
}
公共结构元素
{
[XmlAttribute]
公共字符串名称;
XElement elm = new XElement("PROJECT", new XAttribute("name" project.name),
project.classes.Select(x=> new XElement("CLASS", new XAttribute("name", x.name), new XAttribute("class_id", x.class_id),
x.vars.Select(v=> new XElement("VAR", new XAttribute("name", v.name), new XAttribute("description", v.description), new XAttribute("var_id", v.var_id),
v.elements.Select(e=> new XElement("ELEMENT", new XAttribute("name", e.name),new XAttribute("description", e.description),new XAttribute("element_id", e.element_id)
)))))));
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
namespace ConsoleApplication132
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
XmlWriter writer = XmlWriter.Create(FILENAME, settings);
XmlSerializer serializer = new XmlSerializer(typeof(Project));
Project project = new Project();
serializer.Serialize(writer, project);
}
}
[XmlRoot("PROJECT")]
public class Project
{
[XmlAttribute]
public string name { get; set; }
[XmlElement("CLASS")]
public List<cClass> classes { get; set; }
public Project()
{
name = "test project xml";
classes = new List<cClass>() {
new cClass() {
name = "class1",
class_id = 1,
vars = new List<Var>() {
new Var() {
name = "var name 1",
description = "var description",
var_id = 1,
elements = new List<Element>() {
new Element() {
name = "element name 1",
description = "element description",
element_id = 1
},
new Element() {
name = "element name 2",
description = "element description",
element_id = 2,
elements = new List<Element>() {
new Element() {
name = "element name 3",
description = "element description",
element_id = 3
}
}
},
new Element() {
name = "element name 4",
description = "element description",
element_id = 4,
elements = new List<Element>() {
new Element() {
name = "element name 5",
description = "element description",
element_id = 5,
elements = new List<Element>() {
new Element() {
name = "element name 6",
description = "element description",
element_id = 6
}
}
}
}
},
new Element() {
name = "element name 7",
description = "element description",
element_id = 7,
enums = new List<Enm>() {
new Enm() {
name = "option 1",
value = 1
},
new Enm() {
name = "option 2",
value = 2
},
new Enm() {
name = "option 3",
value = 3
}
}
}
}
},
new Var() {
name = "var name 2",
description = "var description",
var_id = 2,
elements = new List<Element>() {
new Element() {
name = "element name 8",
description = "element description",
element_id = 8
}
}
}
}
}
};
}
}
public class cClass
{
[XmlAttribute]
public string name { get; set; }
[XmlAttribute]
public int class_id;
[XmlElement("VAR")]
public List<Var> vars;
}
public class Var
{
[XmlAttribute]
public string name;
[XmlAttribute]
public string description;
[XmlAttribute]
public int var_id;
[XmlElement("ELEMENT")]
public List<Element> elements;
}
public struct Element
{
[XmlAttribute]
public string name;
[XmlAttribute]
public string description;
[XmlAttribute]
public int element_id;
[XmlElement("ELEMENT")]
public List<Element> elements;
[XmlElement("EMNU")]
public List<Enm> enums;
}
public struct Enm
{
[XmlAttribute]
public string name;
[XmlAttribute]
public int value;
}
}