【发布时间】:2015-06-15 21:20:21
【问题描述】:
我目前遇到了 C# 中 xml 序列化的问题。
我的程序中有一个这样的 XML 结构,它代表一棵树:
<FlatNodeTree>
<Node>
<Level>1</Level>
<Name>Element 0</Name>
<Guid>AAA</Guid>
<NodeType>XElt</NodeType>
<GuidParent />
</Node>
<Node>
<Level>1</Level>
<Name>Block 1</Name>
<Guid>BBB</Guid>
<NodeType>XBlock</NodeType>
<GuidParent />
</Node>
<Node>
<Level>2</Level>
<Name>Element 1</Name>
<Guid>CCC</Guid>
<NodeType>XElt</NodeType>
<GuidParent>BBB</GuidParent>
</Node>
<Node>
<Level>1</Level>
<Name>Element 2</Name>
<Guid>DDD</Guid>
<NodeType>XElt</NodeType>
<GuidParent />
</Node>
</FlatNodeTree>
您可以看到有节点 (XBlock) 和叶子 (XElt),并且级别 > 1 的对象通过 Guid 附加到父节点。
我希望它保存在这样的 xml 结构中(它非常简化,但你明白了):
<Article>
<Elt>Element 0</Elt>
<Block name='Block 1'>
<Elt>Element 1</Elt>
</Block>
<Elt>Element 2</Elt>
</Article>
我用来序列化它的 C# 中的类如下所示:
[Serializable]
public class XArticle
{
public XArticle()
{
Blocks = new List<XBlock>();
Elts = new List<XElt>();
}
[XmlElement("block")]
public List<XBlock> Blocks { get; set; }
[XmlElement("elt")]
public List<XElt> Elts { get; set; }
/*Plenty of other stuff*/
}
我也有 XBlock 和 XElt 课程。 XBlock 类有一个 innerBlocks 属性,它只是一个允许多个级别的列表。
我的问题在于,当我尝试创建 XArticle 时,Blocks 和 Elts 存储在 2 个单独的列表中,所以当然当我尝试序列化它时,它会依次序列化一个列表,我完全失去了块和 elt 的顺序(如果它们是混合的)。
这是我得到的 XML 示例,而不是我之前发布的示例:
<Article>
<Block name='Block 1'>
<Elt>Element 1</Elt>
</Block>
<Elt>Element 0</Elt>
<Elt>Element 2</Elt>
</Article>
你可以看到它先序列化所有块,然后序列化每个节点内的所有元素。
我对序列化知之甚少,我想知道是否有 xml 指令或可以解决此问题的东西。
我想到的一个解决方案是在我创建杂乱无章的 xml 后重新排序 Blocks 和 Elts 标签,但也许有更好的解决方案。
PS:我使用System.Xml.Serialization.XmlSerializer。
PPS : 如果您需要查看将 xpath 数据转换为 X-classes 的函数,请告诉我。
【问题讨论】:
标签: c# xml serialization xpath