3

here's what I'm looking for:

<reports>
  <parameters>
    <parameter name="srid" type="java.lang.Integer">16533</parameter>
    <parameter name="pmid" type="java.lang.Integer">17018</parameter>
    <parameter name="Start" type="java.text.SimpleDateFormat">1/1/2011 12:00:00 AM</parameter>
    <parameter name="End" type="java.text.SimpleDateFormat">1/31/2011 12:00:00 AM</parameter>
  </parameters>
  <parameters>
    <parameter name="srid" type="java.lang.Integer">16099</parameter>
    <parameter name="pmid" type="java.lang.Integer">17018</parameter>
    <parameter name="Start" type="java.text.SimpleDateFormat">1/1/2011 12:00:00 AM</parameter>
    <parameter name="End" type="java.text.SimpleDateFormat">1/31/2011 12:00:00 AM</parameter>
  </parameters>
</reports>

but instead, here's what I'm getting:

<reports>
    <parameters>
      <parameters>
        <parameter name="srid" type="java.lang.Integer">16533</parameter>
        <parameter name="pmid" type="java.lang.Integer">17018</parameter>
        <parameter name="Start" type="java.text.SimpleDateFormat">1/1/2011 12:00:00 AM</parameter>
        <parameter name="End" type="java.text.SimpleDateFormat">1/31/2011 12:00:00 AM</parameter>
      </parameters>
    </parameters>
    <parameters>
      <parameters>
        <parameter name="srid" type="java.lang.Integer">16677</parameter>
        <parameter name="pmid" type="java.lang.Integer">17018</parameter>
        <parameter name="Start" type="java.text.SimpleDateFormat">1/1/2011 12:00:00 AM</parameter>
        <parameter name="End" type="java.text.SimpleDateFormat">1/31/2011 12:00:00 AM</parameter>
      </parameters>
    </parameters>
</reports>

it seems I have an extra <parameters> tag.

Here's my whole model:

type parameter(paramName, javaType, paramValue) =
    let mutable pName = paramName
    let mutable pType = javaType
    let mutable pValue = paramValue

    public new() = 
        new parameter("","","")

    [<XmlAttributeAttribute("name")>]    
    member this.PName with get() = pName and set v = pName <- v

    [<XmlAttributeAttribute("type")>]
    member this.PType with get() = pType and set v = pType <- v

    [<XmlText>]
    member this.PValue with get() = pValue and set v = pValue <- v

type parameters(parameters: parameter array) =
    let mutable paramArray = parameters

    public new() = 
        new parameters(Array.empty)

    [<XmlArray "parameters">]
    member this.ParamArray with get() = paramArray and set v = paramArray <- v

[<XmlRoot("reports")>]
type reports(ps:parameters array) =
    let mutable parms = ps

    public new() =
        new reports(Array.empty)

    [<XmlElement("parameters")>] 
    member this.Ps with get() = parms and set v = parms <- v
5
  • Does this help? stackoverflow.com/questions/2928108/… Commented Feb 8, 2011 at 20:25
  • i don't believe it does. Check my update. I clarified with a second set of parameters. Commented Feb 8, 2011 at 20:32
  • i believe ParamArray needs to be decorated with [<XmlElement "parameter">] Commented Feb 8, 2011 at 20:40
  • Ah, i see. You're both correct then. @Brian, i thought you meant to change the outtermost "<parameters>" to an element - which it already was. Thanks guys! Commented Feb 8, 2011 at 20:43
  • ...so just what exactly is XmlArray used for? Commented Feb 8, 2011 at 20:44

1 Answer 1

1

ok, so i simplified your types a little to look cleaner:

type parameter(paramName) =
   let mutable pName = paramName

   public new() = 
    new parameter("")

   [<XmlAttribute("name")>]    
   member this.PName with get() = pName and set v = pName <- v


type parameters(parameters: parameter array) =
   let mutable paramArray = parameters

   public new() = 
    new parameters(Array.empty)

   [<XmlElement "parameter">]
   member this.ParamArray with get() = paramArray and set v = paramArray <- v

[<XmlRoot("reports")>]
type reports(ps:parameters array) =
   let mutable parms = ps

   public new() =
    new reports(Array.empty)

   [<XmlElement("parameters")>] 
   member this.Ps with get() = parms and set v = parms <- v

and then to serialize these:

    let params1 = parameters ([|parameter("a"); parameter("b")|])
    let params2 = parameters ([|parameter("c"); parameter("d")|])

    let repos = reports ([|params1; params2|])

    use writer = System.Xml.XmlWriter.Create @"C:\temp\foo1.xml"
    let xs = System.Xml.Serialization.XmlSerializer typeof<reports>
    xs.Serialize (writer, repos)

produces:

<reports xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <parameters>
        <parameter name="a" />
        <parameter name="b" />
    </parameters>
    <parameters>
        <parameter name="c" />
        <parameter name="d" />
    </parameters>
</reports>

hth, alex

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.