c#serialization - 包含带属性的简单内容的复杂类型

时间:2013-05-23 11:26:09

标签: c# serialization

我有一个现有的解决方案,它使用svcutil来创建一组基于XSD架构的类。我现在不得不对该架构进行编辑,我遇到了一些绊脚石。

将使用以下类型扩展架构:

<xsd:complexType name="Awkward">
  <xsd:sequence>
    <xsd:element name="awkward1" type="tt:AwkwardChild" nillable="true">      
    </xsd:element>
    <xsd:element name="awkward2" type="tt:AwkwardChild" nillable="true">
    </xsd:element>
  </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="AwkwardChild">
  <xsd:simpleContent>
    <xsd:extension base="tt:AwkwardChildType">
      <xsd:attribute name="id" type="xsd:ID"/>
    </xsd:extension>
  </xsd:simpleContent>
</xsd:complexType>

<xsd:simpleType name="AwkwardChildType">
  <xsd:restriction base="xsd:string">
    <xsd:enumeration value="Dependent"/>
    <xsd:enumeration value="In between"/>
    <xsd:enumeration value="Independent"/>
  </xsd:restriction>
</xsd:simpleType>

这将导致XML输出如下:

<Awkward>
  <awkward1 id="z1">Dependent</awkward1>
  <awkward2 id="z2">Independent</awkward2>
</Awkward>

当试图产生抱怨

时,SVCUtil会窒息

“无法导入命名空间tt中的'AwkwardChild'。不支持具有简单内容扩展的复杂类型。更改架构以便类型可以映射到数据协定类型或使用ImporXmlType或使用不同的序列化程序。”< / p>

我认为我理解这一点,因为它试图输出字符串类型,但包含属性。

我试图弄清楚是否有一种方法可以手动编写一个类来实现这种输出,但我无法找到一种方法来使字符串在xml中显示为“简单内容”节点而不是子元素,例如这堂课:

[DataContractAttribute(Name = "AwkwardChild", Namespace = "tt")]
    public class Awkward
    {
        [DataContractAttribute(Name="id")]
        public string id { get; set; }

        //What do I put here to get this to appear as the content of 
        //the awkward node, not in an element?
        public string nodecontent { get; set; }
    }

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

使用SVCUtil工具和XMLSerializer选项无法解决此问题。最后,我不得不为这个实现IXmlSerializable的特定部分编写一个类,并在write XML方法中输出相应的XML。下面的小样本片段。

writer.WriteStartElement("awkward1");

writer.WriteAttributeString("id1", "z1");

writer.WriteValue(nodeValue);

writer.WriteEndElement();