我有一个这样的XML:
我有一个带有属性名的成员类。
如何使用最新的.NET技术将每个单元及其子单元读取到多个通用List<Unit>中,这些通用List<Unit>可以使用最新的.NET技术以递归的方式再次拥有子单元?
<Root>
<Units Name="Test1">
<Unit Name="Test11" />
<Unit Name="Test12">
<Unit Name="Test21" />
<Unit Name="Test22" />
<Unit Name="Test23">
<Unit Name="Test31" />
<Unit Name="Test32" />
<Unit Name="Test33" />
</Unit>
<Unit Name="Test24" />
</Unit>
</Units>
<Units Name="Test2" />
<!-- ... -->
<Units Name="Test3" />
<!-- ... -->
<Units Name="Test4" />
</Root>发布于 2011-05-29 05:21:47
这可以做到,使用普通的递归:
public class Unit
{
public string Name { get; set; }
public List<Unit> Children { get; set; }
}
class Program
{
public static void Main()
{
XDocument doc = XDocument.Load("test.xml");
List<Unit> units = LoadUnits(doc.Descendants("Units").Elements("Unit"));
}
public static List<Unit> LoadUnits(IEnumerable<XElement> units)
{
return units.Select( x=> new Unit()
{ Name = x.Attribute("Name").Value,
Children = LoadUnits(x.Elements("Unit"))
}).ToList();
}
}发布于 2011-05-29 04:54:14
你为什么不实现一个用于存储单元的树呢?这将比列表更容易、更自然。
看一看使用LinkedList实现的好的this comment。
看见
如果你必须使用列表,那么你可以使用递归来构建它。我假设你的单元有一个属性(IList Unit.ChildUnits)来保存所有的孩子列表。如果不是,您可能想要将Unit包装到另一个具有此属性的类中。
public List<Unit> LoadAllUnits(XMLNode rootNode){
List<Unit> allUnits = new List<Unit>();
foreach(var childNode in rootNode.ChildNodes){
allUnits.Add(LoadAllSubUnits(childNode);
}
return allUnits;
}
private Unit LoadAllSubUnits(XMLNode node){
Unit u = GetUnitFromCurrentNode(node); // Converts current node into Unit object
if(root.HasChildNode){
foreach(var childNode in node.ChildNodes){
u.ChildUnits.Add(LoadAllSubUnits(childNode);
}
}
return u;
}发布于 2011-05-29 05:10:06
挑战是将其编写为1LINQ查询,但这超出了我的能力范围。LINQ并不容易/适用于递归。
我会勾勒出一个解决方案,我不会写出来:
将Xml读入到一个单元中(如果需要,也可以XmlDocument)
class Unit { ... ; ... List<Unit> Children; }
var Lookup = new Dictionary<XNode, Unit> ();查找字典。
https://stackoverflow.com/questions/6164241
复制相似问题