c# - LINQ 到 XML。如何查询列表使用 Linq 递归
问题描述
我正在从结构生成 XML 文件。一些结构成员在List<T>
类型中。我正在使用 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 文件
<PROJECT name="test project xml">
<CLASS name="class1" class_id="1">
<VAR name="var name 1" description="var description" var_id="1">
<ELEMENT name="element name 1" description="element description" element_id="1"/>
<ELEMENT name="element name 2" description="element description" element_id="2">
<ELEMENT name="element name 3" description="element description" element_id="3"/>
</ELEMENT>
<ELEMENT name="element name 4" description="element description" element_id="4">
<ELEMENT name="element name 5" description="element description" element_id="5">
<ELEMENT name="element name 6" description="element description" element_id="6"/>
</ELEMENT>
</ELEMENT>
<ELEMENT name="element name 7" description="element description" element_id="7">
<ENUM name="option 1" value="1"/>
<ENUM name="option 2" value="2"/>
<ENUM name="option 3" value="3"/>
</ELEMENT>
</VAR>
<VAR name="var name 2" description="var description" var_id="2">
<ELEMENT name="element name 8" description="element description" element_id="8">
</VAR>
</CLASS>
</PROJECT>
我编写了这段代码来生成 XML 文件,但它只达到了第一个元素级别。元素中的元素被跳过。我怎样才能让它达到较低的元素水平?一些元素标签也有枚举标签。
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)
)))))));
有没有一种简单的方法可以用最少的代码行来做到这一点?我认为必须有一种递归方法来解决我的问题。
解决方案
使用 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;
}
}
推荐阅读
- r - 基于两列创建年龄变量
- vb.net - 用 100 个结果对 10 个值进行线性插值的最简单方法
- swift - Swift SpriteKit SKSpriteNode 移动
- php - $_POST 在发送请求时给出不需要的输出?
- javascript - execCommand insertHTML 导致嵌套标签
- google-sheets - Google API OAuth 访问令牌上下文。我应该全局、按文档还是按用户保存它?
- python - 将箱线图组合在一个图中
- java - 如何使用 Apache POI 将带边框的图像添加到 Word 中的表格单元格中?
- c# - Listviewitem 绑定到 WPF 中模型类型的静态字段?
- java - 如何编辑存在于矩阵中的变量 - Java?