Я генерирую 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-файл, но он достигает только первого уровня элемента. Элементы внутри элементов пропускаются. Как я могу получить его, чтобы достичь более низких уровней элементов? Также некоторые теги элементов имеют теги enum.
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)
)))))));
Есть ли простой способ сделать это с минимальным количеством строк кода? Я думаю, что должен быть рекурсивный метод, чтобы исправить мою проблему.