簡體   English   中英

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

[英]How Can I add an XSI type to an element that is being serialized using LINQ

我想序列化特定類的類型並包含特定 XSI 類型的對象

我可以在 LINQ 中執行此操作嗎?

LINQ 代表Language-Integrated-Query,它是這樣的:一種查詢技術,允許您將來自各種數據源的數據查詢到一個對象結果中。 你想做一些完全不同的事情,所以 LINQ 只是錯誤的工具。

另外,我猜用於從示例 XML 文件(或架構)生成類的 xsd.exe 不會對您有太大幫助,因為它不夠聰明,無法檢測架構類之間的繼承。

因此,我建議手動編寫 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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM