如何在F#中XML序列化一个数组的数组

3

以下是我需要的内容:

<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>

但实际上,这是我得到的内容:
<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>

看起来我有一个额外的<parameters>标签。

这是我的整个模型:

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

这个有帮助吗?https://dev59.com/LE7Sa4cB1Zd3GeqP0hVh - Brian
我不相信它会这样做。请查看我的更新。我用第二组参数进行了澄清。 - Ramy
我相信ParamArray需要用[<XmlElement "parameter">]进行修饰。 - Alex
啊,我明白了。你们两个都是正确的。@Brian,我以为你是想把最外层的“<parameters>”改成一个元素——但它已经是了。谢谢大家! - Ramy
那么,XmlArray 究竟用于什么? - Ramy
1个回答

1

好的,我稍微简化了一下你的类型,让它看起来更整洁:

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

然后将它们序列化:

    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)

生成:

<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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接