Reputation: 5021
Suppose I have this XML file:
<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>
In general my XML Structural Look Like this:
<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...-->
As far as I understand using a built in C# deserialize does not work, because There is no a fixed structure to the file.
Does anyone have an idea how I create a hierarchy C# objects (deserialize) base on this structure?
If it's possible I'd glad to see an example, or maybe a tutorial how to build such a thing.
Upvotes: 0
Views: 995
Reputation: 1125
Since you don't have a scheme definition file you could code it by yourself. XmlDocument works great here.
Its not a working example. But you will get the clue.
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));
}
}
}
It is basically traversing XmlNode in XmlNodeLists fetching the Attributes and InnerValues of those nodes.
Upvotes: 3