使用序列化将复杂的xml文件转换为c#对象
本文关键字:转换 文件 对象 xml 序列化 复杂 | 更新日期: 2023-09-27 18:04:15
假设我有这样一个XML文件:
<functionList>
<function name="a" id="11" >
<InputParameters>
<Value>
<Range>
<DiscreteRange>
<DiscreteValue value="0" description="Stream 1" />
<DiscreteValue value="1" description="Stream 2" />
</DiscreteRange>
</Range>
</Value>
</InputParameters>
<ReturnValues>
<Status type="BYTE" description="0 successful, error otherwise">
<Range>
<SequenceRange min="0x00" max="0xFF"/>
</Range>
</Status>
<Value type="UWORD32" description="Stream select setting">
<Range>
<DiscreteRange>
<DiscreteValue value="0" description="Stream 1" />
<DiscreteValue value="1" description="Stream 2" />
</DiscreteRange>
</Range>
</Value>
</ReturnValues>
</functions>
<function name="b" id="12" >
<InputParameters>
<Value>
<Range>
<SequenceRange min="0x00" max="0xFF"/>
</Range>
</Value>
</InputParameters>
<ReturnValues>
<Status type="BYTE" description="0 successful, error otherwise">
<Range>
<SequenceRange min="0x00" max="0xFF"/>
</Range>
</Status>
<Value type="UWORD32" description="Stream select setting">
<Range>
<DiscreteRange>
<DiscreteValue value="0" description="Stream 1" />
<DiscreteValue value="1" description="Stream 2" />
</DiscreteRange>
</Range>
</Value>
</ReturnValues>
</functions>
<function name="c" id="13" >
<InputParameters></InputParameters>
<ReturnValues>
<Status type="BYTE" description="0 successful, error otherwise">
<Range>
<SequenceRange min="0x00" max="0xFF"/>
</Range>
</Status>
</ReturnValues>
</function>
一般来说,我的XML结构是这样的:
<functionList >
<function name="" id="">
<InputParameters>
<!--Optional -->
<Value type="" description="">
<Range>
<!--OR-->
<DiscreteRange>
<DiscreteValue value="" description="" />
<DiscreteValue value="" description="" />
<!--...-->
</DiscreteRange>
<!--OR-->
<SequenceRange min="" max=""/>
<!--OR-->
<StringRange characters=""/>
<!--OR-->
<CharRange/>
</Range>
</Value>
<!-- <Value type="" description="">...-->
<!-- </Value>-->
<!-- <Value type="" description="">...-->
<!-- </Value>-->
<!-- <Value type="" description="">...-->
<!-- </Value>-->
<!--...-->
</InputParameters>
<ReturnValues>
<Status type="" description="">
<Range>
<!--OR-->
<DiscreteRange>
<DiscreteValue value="" description="" />
<DiscreteValue value="" description="" />
<!--...-->
</DiscreteRange>
<!--OR-->
<SequenceRange min="" max=""/>
<!--OR-->
<StringRange characters=""/>
<!--OR-->
<CharRange/>
</Range>
</Status >
<!--Optional -->
<Value type="" description="">
<Range>
<!--OR-->
<DiscreteRange>
<DiscreteValue value="" description="" />
<DiscreteValue value="" description="" />
<!--...-->
</DiscreteRange>
<!--OR-->
<SequenceRange min="" max=""/>
<!--OR-->
<StringRange characters=""/>
<!--OR-->
<CharRange/>
</Range>
</Value>
<!-- <Value type="" description="">...-->
<!-- </Value>-->
<!-- <Value type="" description="">...-->
<!-- </Value>-->
<!-- <Value type="" description="">...-->
<!-- </Value>-->
<!--...-->
</ReturnValues>
</function>
<!--function...-->
据我所知,使用c#内置的反序列化不起作用,因为没有固定的结构到文件。
有没有人知道我如何创建一个层次c#对象(反序列化)基于这个结构?
如果可能的话,我很乐意看到一个例子,或者一个教程如何构建这样的东西。
由于您没有方案定义文件,您可以自己编写。XmlDocument在这里很好用。
这不是一个有效的例子。但你会明白的。
public class Document
{
public static Document Create(Stream input)
{
var doc = new XmlDocument();
doc.Load(input);
return new Document(doc);
}
public class Function
{
public string Name { get; set; }
public string Id { get; set; }
public Function(XmlNode node)
{
Name = node.Attributes["name"].ToString();
Id = node.Attributes["id"].ToString();
}
// Return values
// Parameters
}
public List<Function> Functions { get; set; }
public Document(XmlDocument doc)
{
Functions = new List<Function>();
var list = doc.GetElementsByTagName("functionlist");
XmlNode root = list[0];
XmlNodeList children = root.ChildNodes;
foreach (var child in children)
{
Functions.Add(new Function(child));
}
}
}
它基本上是在XmlNodeLists中遍历XmlNode,获取这些节点的Attributes和InnerValues。