繁体   English   中英

如何在XML序列化运行时(ASP.Net WebApi)期间更改XML元素的名称

[英]How to change the name of an XML element during XML Serialization runtime (ASP.Net WebApi)

我正在构建对WebAPI服务调用的响应。 默认的XML Serializer最适合我。 我需要生成的是这样的:

<fooCollection>
  <fooMember>
    <fooType1>
      ...bunch of properties for the fooMember
    </fooType1>
  </fooMember>
  <fooMember>
    <fooType2>
      ...bunch of properties for the fooMember
    </fooType2>
  </fooMember>
</fooCollection

<fooType>的问题是<fooType>元素当前是模型中名为fooType的对象。 根据我的fooMember对象的type属性,响应中的元素名称需要具有不同的名称。 这意味着使用[DataContract][DataMember]属性之类的名称为其指定对象名称以外的名称似乎不起作用,因为它们只设置了一次,而我找不到在运行时更改它的方法。

我的模型代码如下所示:

  public partial class fooCollection {
    private fooCollectionMember[] memberField;

    [System.Xml.Serialization.XmlElementAttribute("fooMember")]
    public fooCollectionMember[] member { get; set;}
  }

  public partial class fooCollectionMember {
    private fooType fooTypeField;
    public fooType fooType { get; set }
  }

  public partial class fooType {
    private object fooProperty;
    // ... more properties
    public object fooProperty { get; set; }
    // ... more properties
  }

在运行时/序列化期间,是否可以设置<fooType>元素的元素名称?

或者,有没有一种方法可以重新排列模型,因此fooType不是内部具有其余属性的对象,而是fooMember对象的属性以及所有其他属性,而当序列化<fooType>元素被命名为该属性的值,并在其中封装其余属性?

我最初的服务调用get方法是这样的:

    public FooCollection Get () {
      FooCollection foos = new FooCollection();
      // code to fill model
      return foos;
    }

我没有发现任何东西可以让我在基于FooCollection中的属性或对象的响应中采用XML元素,并根据属性/对象的值在XML响应中更改该元素的名称。 即,我不能拥有FooProperty属性,该属性的XML响应中生成的元素的每个集合项都具有不同的元素名称。 换句话说,如果我使用自动返回模型对象和序列化的方法,则此属性在整个XML文档中只能具有单个元素名称。 但是,我找到了一种变通办法,让我可以根据需要更改元素名称。

不是让我的Get()服务方法返回FooCollection类型的对象,而是在返回之后自动对其进行序列化,而是返回HttpResponseMessage对象。 这样,我可以手动序列化我的模型,根据需要进行操作,然后将其作为HttpResponseMessage返回。

因此,现在我的get服务方法可以看起来更像这样来实现我的目标:

public HttpResponseMessage Get () {
  XmlSerializer xmlSerializer = new XmlSerializer(typeof(FooCollection));
  System.IO.StringWriter stringWriter = new System.IO.StringWriter();
  XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
  FooCollection foos = new FooCollection();
  // code to populate FooCollection model, assign namespaces, etc
  xmlSerializer.Serialize(stringWriter, foos, namespaces);
  // Now we can manipulate stringWriter value however is needed to replace the element names
  return new HttpResponseMessage() {
    Content = new StringContent(stringWriter.ToString(), Encoding.UTF8, "application/xml")
  };
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM