如何将 XSI 类型添加到正在使用 LINQ 序列化的元素
How Can I add an XSI type to an element that is being serialized using LINQ
我想序列化特定 class 类型的对象并包含特定 XSI 类型
我可以在 LINQ 中执行此操作吗?
LINQ 代表语言集成查询,这就是它的含义:一种查询技术,允许您将来自各种数据源的数据查询到对象结果中。您想做一些完全不同的事情,所以 LINQ 是错误的工具。
此外,我猜用于从示例 XML 文件(或模式)生成 类 的 xsd.exe 不会对您有太大帮助,因为 afaik 它不是足够聪明来检测模式 类.
之间的继承
因此,我建议手动编写一个 XML 模式,然后使用 xsd.exe 为该模式生成 类。然后你可以实例化那些 类 并且 XmlSerializer
会给你一个你期望的输出。
架构应该有点像下面这样(我在这里排除了实际的模型内容,你必须选择是把它放在 Model
还是 SettingsModel
中)。
<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>
得到以下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 to XML 是一种挫败感练习。从长远来看,您可能更愿意使用带有适当 XML 序列化装饰器的具体 类。
===编辑===
下面是一些将数据写入 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);
}
我想序列化特定 class 类型的对象并包含特定 XSI 类型
我可以在 LINQ 中执行此操作吗?
LINQ 代表语言集成查询,这就是它的含义:一种查询技术,允许您将来自各种数据源的数据查询到对象结果中。您想做一些完全不同的事情,所以 LINQ 是错误的工具。
此外,我猜用于从示例 XML 文件(或模式)生成 类 的 xsd.exe 不会对您有太大帮助,因为 afaik 它不是足够聪明来检测模式 类.
之间的继承因此,我建议手动编写一个 XML 模式,然后使用 xsd.exe 为该模式生成 类。然后你可以实例化那些 类 并且 XmlSerializer
会给你一个你期望的输出。
架构应该有点像下面这样(我在这里排除了实际的模型内容,你必须选择是把它放在 Model
还是 SettingsModel
中)。
<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>
得到以下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 to XML 是一种挫败感练习。从长远来看,您可能更愿意使用带有适当 XML 序列化装饰器的具体 类。
===编辑===
下面是一些将数据写入 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);
}