如何将XSI类型添加到使用LINQ序列化的元素中



我想序列化某种类型的类型的对象并包含特定的XSI类型

我可以在linq?

中执行此操作

获取以下XML:

<Model xsi:type="SettingsModel" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Name>Test05</Name>
  <IsActive>false</IsActive>
  <IsHidden>false</IsHidden>
</Model>

您可以使用以下代码:

var model = new { Name = "Test05", IsActive = false, IsHidden = false };
var namespaceName = "http://www.w3.org/2001/XMLSchema-instance";
XNamespace xsi = XNamespace.Get(namespaceName);
var x = new XElement("Model",
    new XAttribute(xsi + "type", "SettingsModel"),
    new XAttribute(XNamespace.Xmlns + "xsi", namespaceName),
    new XElement("Name", model.Name),
    new XElement("IsActive", model.IsActive),
    new XElement("IsHidden", model.IsHidden)
    );
Console.WriteLine(x);

linq到XML是一种沮丧的练习。从长远来看,您可能更喜欢使用具有适当XML序列化装饰器的具体类。

=== edit ===

这是一些将数据写入XML文件的其他代码:

var settings = new XmlWriterSettings()
{
    Indent = true,
    OmitXmlDeclaration = true
};
using (var stream = new FileStream("Test05.xml", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None))
using (var writer = XmlWriter.Create(stream, settings))
{
    x.WriteTo(writer);
}

linq代表语言融合 - Query,这就是:一种查询技术,可让您从各种数据源查询数据中的数据。您想做完全不同的事情,因此Linq只是错误的工具。

另外,我想用于从示例XML文件(或架构(生成类的XSD.EXE对您没有太大帮助,因为Afaik不够聪明,无法检测架构类之间的继承。

因此,我建议手动编写XML模式,然后使用XSD.EXE生成该模式的类。然后,您可以实例化这些类,XmlSerializer将为您提供您的输出。

架构应该有点像以下内容(我在这里排除了实际模型内容,您必须选择是否将其放入ModelSettingsModel中(。

<xs:element name="Model" type="Model" />
<xs:class name="Model" abstract="True">
  <xs:complexContent />
</xs:class>
<xs:class name="SettingsModel">
  <xs:complexContent>
    <xs:extension base="Model" />
  </xs:complexContent>
</xs:class>

最新更新