3

我有一个现有的解决方案,它使用 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 或使用不同的序列化程序。”

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

我试图弄清楚是否有一种方法可以手动编写一个类来实现这种输出,但我想不出一种方法让字符串在 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; }
    }

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

4

1 回答 1

1

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

writer.WriteStartElement("awkward1");

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

writer.WriteValue(nodeValue);

writer.WriteEndElement();
于 2013-12-16T13:43:41.583 回答