首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#序列化xsi:type和xsd

C#序列化xsi:type和xsd
EN

Stack Overflow用户
提问于 2010-12-08 01:15:38
回答 2查看 12.1K关注 0票数 5

我有一个定义如下的模式:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="Books" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="Books" msdata:IsDataSet="true" msdata:Locale="en-US">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="Book" type="MyBookType"></xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="MyBookType">
  ...
  </xs:complexType>

</xs:schema>

使用这个模式和xsd.exe,我生成了在序列化过程中使用的类。由上述模式生成的类在序列化时会生成以下xml:

代码语言:javascript
复制
<Books>
  <Book>
  ...
  </Book>
</Books>

此xml在SOAP请求中使用,而另一端的服务需要以下xml:

代码语言:javascript
复制
<Books>
  <Book xsi:type="MyBookType">
  ...
  </Book>
</Books>

如何编辑我的模式,使xsi:type属性包含在序列化的xml中?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-09 22:08:34

使用派生类型和XmlInclude属性。例如:

代码语言:javascript
复制
public class Book
{
    public string Title;
    public string Author;
}

public class MyBookType : Book { }

[XmlInclude(typeof(MyBookType))]
[XmlRoot("Books")]
public class Books : List<Book> { }

public void Run()
{
    var b =  new Books();
    b.Add(new MyBookType
        {
            Title = "The Art of War",
            Author = "Sun Tzu"
        });
    b.Add(new MyBookType
        {
            Title = "Great Expectations",
            Author = "Charles Dickens"
        });

    var s = new XmlSerializer(typeof(Books));
    s.Serialize(Console.Out, b);
}

运行此命令将生成以下输出:

代码语言:javascript
复制
<?xml version="1.0" encoding="IBM437"?>
<Books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Book xsi:type="MyBookType">
    <Title>The Art of War</Title>
    <Author>Sun Tzu</Author>
  </Book>
  <Book xsi:type="MyBookType">
    <Title>Great Expectations</Title>
    <Author>Charles Dickens</Author>
  </Book>
</Books>

由于您使用的是SOAP请求,因此我假定使用ASMX,这意味着序列化是隐式发生的。您将需要将[XmlInclude]应用于保存图书集合的任何内容。例如,这可以是webmethod中的一个参数。

如果在XSD中定义类型,则可以自动生成适当的XmlInclude属性,从XSD和WSDL开始,继承关系在C#代码中进行了说明。

在WSDL中,请求消息可能采用Books类型,该类型是Book的集合。另外,定义一个从Book派生但不扩展它的MyBookType

票数 5
EN

Stack Overflow用户

发布于 2021-05-11 03:46:42

@Ivan Lopez

不要使用派生类来代替我们的XMLAttribute,声明如下所示的属性,然后赋值

代码语言:javascript
复制
[XmlAttribute("type", Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
public string type;
var document = new MyDocument 
{
type = "cbl:SomeContent";
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4379512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档