我正在解析XML结构,我的类看起来像如下:
class MyXml
{
//...
List<Node> Content { get; set; }
//...
}
class Node
{
// ...
public List<Node> Nodes { get; set; }
public string Type { get; set; }
//...
}
Run Code Online (Sandbox Code Playgroud)
MyXml表示我正在解析的XML文件,其元素都被调用<node>.每个节点都有一个type属性,可以有不同的值.
节点的类型未与其深度相关联.我可以在任何深度级别拥有任何节点类型.
我可以正确地解析结构,所以我得到一个与myXML对象,其内容为节点,即列表中曾经节点可以有子节点等等(我用递归为)的列表.
我需要做的是展平整个结构并仅提取某种类型的节点.
我尝试过:
var query = MyXml.Content.SelectMany(n => n.Nodes);
Run Code Online (Sandbox Code Playgroud)
但它只采用结构深度为1的节点.我想在同一个集合中抓取每个节点,无论深度如何,然后过滤我需要的东西.
好像我再次陷入递归算法......
我的应用程序应该根据用户指定的信息并根据由以下字符串表示的子文件夹结构将文件排序到不同的文件夹:
[ROOT] \ brand \ color \ material \
Run Code Online (Sandbox Code Playgroud)
结构字符串中的标记表示集合:
假设:
var brand = new List<string> { "Nike", "Adidas", "Reebok" };
var color = new List<string> { "red", "blue", "yellow", "black" };
var material = new List<string> { "leather", "fabric" };
var data = new List<List<string>>() { brand, color, material };
Run Code Online (Sandbox Code Playgroud)
而我想要得到的是:
[ROOT]\Nike\red\leather
[ROOT]\Nike\red\fabric
[ROOT]\Nike\blue\leather
[ROOT]\Nike\blue\fabric
[ROOT]\Nike\yellow\leather
[ROOT]\Nike\yellow\fabric
[ROOT]\Nike\black\leather
[ROOT]\Nike\black\fabric
[ROOT]\Adidas\red\leather
[ROOT]\Adidas\red\fabric
[ROOT]\Adidas\blue\leather
[ROOT]\Adidas\blue\fabric
[ROOT]\Adidas\yellow\leather
[ROOT]\Adidas\yellow\fabric
[ROOT]\Adidas\black\leather
[ROOT]\Adidas\black\fabric
[ROOT]\Reebok\red\leather
[ROOT]\Reebok\red\fabric
[ROOT]\Reebok\blue\leather
[ROOT]\Reebok\blue\fabric
[ROOT]\Reebok\yellow\leather
[ROOT]\Reebok\yellow\fabric
[ROOT]\Reebok\black\leather
[ROOT]\Reebok\black\fabric
Run Code Online (Sandbox Code Playgroud)
问题是数据标签(品牌,颜色,材料)及其顺序的数量是事先不知道的,因此需要递归.
任何的想法?
非常感谢你提前!