猿问

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

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

我可以在 LINQ 中执行此操作吗?


GCT1015
浏览 117回答 2
2回答

茅侃侃

要获取以下 XML:<Model xsi:type="SettingsModel" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">&nbsp; <Name>Test05</Name>&nbsp; <IsActive>false</IsActive>&nbsp; <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",&nbsp; &nbsp; new XAttribute(xsi + "type", "SettingsModel"),&nbsp; &nbsp; new XAttribute(XNamespace.Xmlns + "xsi", namespaceName),&nbsp; &nbsp; new XElement("Name", model.Name),&nbsp; &nbsp; new XElement("IsActive", model.IsActive),&nbsp; &nbsp; new XElement("IsHidden", model.IsHidden)&nbsp; &nbsp; );Console.WriteLine(x);LINQ to XML 是一种令人沮丧的练习。从长远来看,您可能更喜欢使用带有适当 XML 序列化装饰器的具体类。===编辑===以下是将数据写入 XML 文件的一些附加代码:var settings = new XmlWriterSettings(){&nbsp; &nbsp; Indent = true,&nbsp; &nbsp; OmitXmlDeclaration = true};using (var stream = new FileStream("Test05.xml", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None))using (var writer = XmlWriter.Create(stream, settings)){&nbsp; &nbsp; x.WriteTo(writer);}

胡子哥哥

LINQ 代表语言集成查询,它就是这样:一种查询技术,允许您将来自各种数据源的数据查询到对象结果中。您想要做一些完全不同的事情,所以 LINQ 是一个错误的工具。另外,我猜想用于从示例 XML 文件(或架构)生成类的 xsd.exe 对您没有多大帮助,因为据我所知,它不够聪明,无法检测架构类之间的继承。因此,我建议手动编写 XML 架构,然后使用 xsd.exe 为该架构生成类。然后,您可以实例化这些类,并且XmlSerializer将按照您的预期提供输出。架构应该类似于以下内容(我在这里排除了实际的模型内容,您必须选择是否将其放入Model或SettingsModel)。<xs:element name="Model" type="Model" /><xs:class name="Model" abstract="True">&nbsp; <xs:complexContent /></xs:class><xs:class name="SettingsModel">&nbsp; <xs:complexContent>&nbsp; &nbsp; <xs:extension base="Model" />&nbsp; </xs:complexContent></xs:class>
随时随地看视频慕课网APP
我要回答