我不确定这是不是一件简单的事情。
我的XML文件是这样构建的:
<DEFTABLE>
<CUBE NAME="FristCube" />
<OUT NAME="Line1" />
<OUT NAME="Line2" />
<IN NAME="LineX" />
<IN NAME="LineY" />
</CUBE>
<CUBE NAME="SecondCube" />
<OUT NAME="LineX" />
<OUT NAME="LineY" />
<IN NAME="Line1" />
<IN NAME="Line2" />
</CUBE>
</DEFTABLE>
现在我创建了一个包含所有多维数据集名称的列表,一个包含所有内联列表的列表和一个包含所有OutLines的列表。 正如您所看到的,一个Cube可以有多个InLines和OutLines - 我如何将它们匹配在一起?
我想我需要一个班级&#34; Cube&#34;包括所有内线和外线,但我不知道如何实现这一点。
我想创建CubeList的3D对象(在Unity中)并使用正确的线连接这些多维数据集。
这就是我将信息输入列表的方式:
private List<Cube> GetCubeList()
{
XDocument xmlDoc = XDocument.Load (@"Cube_List.xml");
var cubes = (from c in xmlDoc.Root.Elements("CUBE")
select new Cube
{
Cubename = (string)c.Attribute("NAME"),
}).ToList();
return cubes.ToList();
}
...
private List<IN> GetINLines()
{
XDocument xmlDoc = XDocument.Load (@"Cube_List.xml");
var inline = (from line in xmlDoc.Root.Elements("CUBE").Descendants("IN")
select new InLine
{
Inline = (string)line.Attribute("NAME").Value,
}).ToList();
return inline().ToList();
}
答案 0 :(得分:3)
创建一个Cube
- 类作为傻瓜:
public class Cube
{
[XmlAttribute("Name")]
public string Name { get; set; }
[XmlArrayItem("In")
public List<Element> In { get; set; }
[XmlArrayItem("Out")
public List<Element> Out { get; set; }
}
public class Element
{
[XmlAttribute("Name")]
public string Name { get; set, }
}
最后,您需要周围的DEFTABLE
- 课程:
[XmlRoot("DEFTABLE")]
public class DefTable
{
[XmlArrayItem("Cube")]
public List<Cube> Cubes { get; set; }
}
这应该很容易序列化/反序列化到/从Xml文件:
var ser = new XmlSerializer(typeof(DefTable));
var instance = (DefTable) ser.DeSerialize(myFile);
这种方式比依赖Linq2Xml容易得多,因为您可以直接使用之前创建的类结构。
有关序列化的更多信息和示例,请查看MSDN。
编辑:要获得In
的所有Cube
行,现在非常简单:
var cube = instance.Cubes.Single(x => x.Name == "FristCube");
var inLines = cube.In;
答案 1 :(得分:0)
这是一种方法:
XmlDocument doc = new XmlDocument();
doc.Load(@"Cube_List.xml");
List<XmlNode> allInOutNodes = new List<XmlNode>();
var nodes = doc.SelectNodes("DEFTABLE/CUBE");
foreach (XmlNode node in nodes)
{
allInOutNodes.AddRange(node.ChildNodes.OfType<XmlNode>());
}
答案 2 :(得分:0)
你需要一个两遍算法。第一遍创建立方体,边,并为侧面分配输入。第二次通过会向两侧增加输出。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication43
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);
//pass one create cube and inputs
foreach(XElement cube in doc.Descendants("CUBE"))
{
Cube newCube = new Cube();
Cube.cubes.Add(newCube);
newCube.name = (string)cube.Attribute("NAME");
newCube.sides = cube.Elements("IN").Select(y => new Side() {
name = (string)y.Attribute("NAME"),
_in = newCube
}).ToList();
}
foreach (XElement xCube in doc.Descendants("CUBE"))
{
string outCubeName = (string)xCube.Attribute("NAME");
Cube outCube = Cube.cubes.Where(x => x.name == outCubeName).FirstOrDefault();
foreach(XElement _out in xCube.Elements("OUT"))
{
string sideName = (string)_out.Attribute("NAME");
Boolean found = false;
foreach (Cube inCube in Cube.cubes)
{
foreach (Side side in inCube.sides)
{
if (side.name == sideName)
{
side._out = outCube;
found = true;
break;
}
}
if (found == true) break;
}
}
}
}
}
public class Cube
{
public static List<Cube> cubes = new List<Cube>();
public string name { get; set; }
public List<Side> sides { get; set; }
}
public class Side
{
public string name { get; set; }
public Cube _in { get; set; }
public Cube _out { get; set; }
}
}