media-io / yaserde

Yet Another Serializer/Deserializer
MIT License
174 stars 58 forks source link

Is it possible to parse tags with the same name but different children? #151

Open miguelsilva5989 opened 1 year ago

miguelsilva5989 commented 1 year ago

I'm having some trouble trying to find the best way of deserializing the following XML. Inside TaskList the Task tags are the same but their inner children are different. Is there any way of parsing this in order to differentiate between 2 tasks based on their class attribute?

I was playing around with Enums and such but I don't see any way of doing this except implementing the deserialize method manually. Was trying to find a similar example in the examples folder but I don't see nothing like this.

Thanks in advance (I'm quite new to rust so I am sorry if this question seems silly)

<tasklist>
<task class="Aggregator" documentation="" name="Task Aggregator" taskkey="TaskAggregator" x="4000" y="640">
    <parameter name="Entity" type="Map">
        <parameter name="key" type="String">xxx</parameter>
        <parameter name="value" type="String">xxx</parameter>
    </parameter>
</task>
<task class="Transform" documentation="" name="Transform" taskkey="Transform" x="1440" y="560">
    <parameter name="Rules" type="Xml">
        <root advancedmode="false">\n    <set in="Flow" toValue="123" varType="String" variable="asd"></set>\n</root>
    </parameter>
</task>
</tasklist>
MarcAntoine-Arnaud commented 1 year ago

Hello,

I you case I wanna to wrote like it to parse the XML:

Task {
  #[yaserde(attribute)]
  class: String,
  #[yaserde(attribute)]
  documentation: String,
  #[yaserde(attribute)]
  name: String,
  #[yaserde(attribute)]
  taskkey: String,
  #[yaserde(attribute)]
  x: usize,
  #[yaserde(attribute)]
  y: usize,
  parameter: Parameter
}

struct Parameter {
  #[yaserde(attribute)]
  name: String,
  #[yaserde(attribute)]
  type: String,
  parameters: Vec<Parameters>,
  root: Option<Root>,
}

is it relevant ?