【问题标题】:How to change the name of an XML element during XML Serialization runtime (ASP.Net WebApi)如何在 XML 序列化运行时更改 XML 元素的名称(ASP.Net WebApi)
【发布时间】:2017-02-23 17:24:56
【问题描述】:

我正在构建对 WebAPI 服务调用的响应。默认的 XML 序列化程序主要为我工作。我需要生成的是这样的:

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

我遇到的问题是&lt;fooType&gt; 元素目前是我模型中的一个对象,名为fooType。响应中的元素名称需要有不同的名称,具体取决于我的fooMember 对象的类型属性。这意味着使用像[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
  }

在运行时/序列化期间有没有一种方法可以为&lt;fooType&gt; 元素设置我的元素名称?

或者,有没有一种方法可以重新排列我的模型,使fooType 不是包含其他属性的对象,而是fooMember 对象的属性以及所有其他属性,但是,当序列化时,&lt;fooType&gt; 元素被命名为该属性的值并将其余属性封装在其中?

【问题讨论】:

    标签: c# asp.net asp.net-web-api xml-serialization


    【解决方案1】:

    我原来的服务调用 get 方法是这样的:

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

    我没有发现任何东西可以让我在响应中获取基于 FooCollection 中的属性或对象的 XML 元素,并根据属性/对象的值在 XML 响应中更改该元素的名称。即我不能有一个 FooProperty 属性,其在 XML 响应中生成的元素对于每个集合项具有不同的元素名称。换句话说,如果我使用 return-a-model-object-and-let-the-serialization-happen-automatically 方法,这个属性在整个 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")
      };
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      • 2011-09-17
      相关资源
      最近更新 更多