假设我有这个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#对象(反序列化)?
如果可能的话,我很高兴看到一个例子,或者教程如何构建这样的东西。
答案 0 :(得分:3)
由于您没有方案定义文件,您可以自己编写代码。 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。