2015-04-23 48 views
0

我目前正在尝试为基于XML的collada(.dae)文件导入一个导入程序。我将xml文件反序列化到可以轻松访问的对象中。 例如,.dae文件可以具有这样的设置...如何轻松遍历反序列化的Xml文档?

<library_geometries> 
<geometry id="Cube1s_008-mesh" name="Cube1s.008"> 
    <mesh> 
    <source id="Cube1s_008-mesh-positions"> 
     <float_array ...... /> 
    </source> 
    <source id="Cube1s_008-mesh-normals"> 
    </source> 
    <vertices id="Cube1s_008-mesh-vertices"> 
     <input semantic="POSITION" source="#Cube1s_008-mesh-positions"/> 
    </vertices> 
    </mesh> 
</geometry> 
<geometry> 
.... 
</geometry> 
</library_geometries> 

据(与xmlSerializer.Deserialize)以类似的方式,然后反序列化。因此,要访问“网格”中的第二个“源”,我会做library_geometries.geometry [0] .mesh.source [1];

一切都很好,我遇到的问题很容易遍历这个反序列化的XML文档。

例如,在“顶点”中有一个source =“#Cube1s_008-mesh-positions”,其基本意思是“访问顶点数据,去源ID为”Cube1s_008-mesh-positions“ 。我想要做的就是轻松地从顶点直接到源或任何具有该ID的任何东西。 所以它看起来像是library_geometries.geometry [0] .mesh.vertices.GoToSource();并与我可以做library_geometries.geometry [0] .mesh.vertices.GoToSource()。float_array.values;

我假设我需要用反射来做到这一点。 也许搜索任何具有[XmlAttribute(“id”)]的字段,然后以某种方式返回其正确类型的对象。 任何想法表示赞赏。

回答

0

您可以使用两种基本方法。

1) Build a dictionary 
 
2) Add a new property Geometry geometry to the class veritices which is NonSerialize. After deserialize, enumerate through the classes adding the value to the property geometry.

+0

你的第二个方法类似于我一直在做的事情。我在名为“sourceElement”的顶点类中添加了一个变量,这个变量可以直接引导我指向这个顶点所指向的源元素。要设置它,我必须做反射,获取所有源,找到顶点指向的源并将其分配给sourceElement变量。问题是,我需要为具有ID属性的每种元素执行此操作。然后我开始试图获取任何具有ID属性并存储它的内容,但是当它存储时,它是一个对象,并且不会以正确的类型存储,从而使其不可用 – HiddenMonk

0

这就是为什么我喜欢的字典。我经常使用下面的类来嵌套结构。

public class Node 
 
{ 
 
    public string name { get; set; } 
 
    public List<Node> children { get; set; } 
 
    public Dictionary<string, string> dict { get; set; } 
 
}