![](/img/trans.png)
[英]Omitting all xsi and xsd namespaces when serializing an object in .NET?
[英]C# serializing xsi:type and xsd
我有一个定义如下的模式:
<?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:
<Books>
<Book>
...
</Book>
</Books>
此 xml 用于 SOAP 请求,另一端的服务需要以下 xml:
<Books>
<Book xsi:type="MyBookType">
...
</Book>
</Books>
如何编辑我的架构,以便 xsi:type 属性包含在序列化的 xml 中?
使用派生类型和XmlInclude
属性。 例如:
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);
}
运行它会产生以下输出:
<?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 中的参数。
您可以自动生成适当的 XmlInclude 属性,从 XSD 和 WSDL 开始,如果您在 XSD 中定义类型,以及我在 C# 代码中说明的继承关系。
在 WSDL 中,请求消息可能采用Books
类型,它是Book
的集合。 单独定义一个MyBookType
,它派生自 Book 但不扩展它。
@伊万洛佩兹
不要使用派生类,而是使用 XMLAttribute,如下所示声明属性,然后赋值
[XmlAttribute("type", Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
public string type;
var document = new MyDocument
{
type = "cbl:SomeContent";
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.