gpt4 book ai didi

c# 序列化 - 包含具有属性的简单内容的复杂类型

转载 作者:行者123 更新时间:2023-11-30 17:53:51 25 4
gpt4 key购买 nike

我有一个现有的解决方案,它使用 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; }
}

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

最佳答案

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

writer.WriteStartElement("awkward1");

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

writer.WriteValue(nodeValue);

writer.WriteEndElement();

关于c# 序列化 - 包含具有属性的简单内容的复杂类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16712703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com