我有一个现有的解决方案,它使用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; }
}
有人能指出我正确的方向吗?
答案 0 :(得分:1)
使用SVCUtil工具和XMLSerializer选项无法解决此问题。最后,我不得不为这个实现IXmlSerializable的特定部分编写一个类,并在write XML方法中输出相应的XML。下面的小样本片段。
writer.WriteStartElement("awkward1");
writer.WriteAttributeString("id1", "z1");
writer.WriteValue(nodeValue);
writer.WriteEndElement();