【问题标题】:How to serialize an c# object into xml without schema info? [duplicate]如何在没有架构信息的情况下将 c# 对象序列化为 xml? [复制]
【发布时间】:2014-08-12 20:51:45
【问题描述】:

这就是我所做的:

一个可序列化的类:

[Serializable()]
public class Ticket
{
    public string   CitationNumber { get; set; }
    public decimal Amount { get; set; }
}

然后将模型序列化成xml:

var model = cart.Citations
    .Select(c => new Ticket(c.Number, c.Amount)).ToList();
var serializer = new XmlSerializer(typeof (List<Ticket>));
var sw = new StringWriter();
serializer.Serialize(sw, model);
return sw.ToString();

输出sw.ToString() 是这样的

<?xml version="1.0" encoding="utf-16"?>
<ArrayOfTicket xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Ticket>
<CitationNumber>00092844</CitationNumber>
<Amount>20</Amount>
</Ticket>
</ArrayOfTicket>  

有没有办法自定义 Serialize() 输出以删除这些架构信息,例如:&lt;?xml version="1.0" encoding="utf-16"?&gt;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"

如何将根元素 ArrayOfTicket 更改为其他内容?

我可以控制这些输出吗?

【问题讨论】:

  • 它保存在数据库中,我真的不需要那些额外的信息。
  • 我认为这不会产生影响,即使从长远来看也是如此。另外,为什么不将每个项目(CitationNumber,Amount,...)单独存储为它自己的表,而不是将 xml 存储在数据库中?您不能轻松查询存储的 xml。
  • 您是否考虑过将数据转换为 DataTable,然后从那里开始。我已经这样做了好几次,如果您愿意,我可以给您发送一个工作示例。就我而言,我正在从 .csv 文件中读取数据,然后将其加载到 DataTable 中,然后使用 MissingSchemaAction 将其序列化为 XML

标签: c# xml serialization


【解决方案1】:

你需要一些 xml 技巧...

var serializer = new XmlSerializer(typeof(List<Ticket>));

var ns = new XmlSerializerNamespaces();
ns.Add("", "");
var sw = new StringWriter();
var xmlWriter = XmlWriter.Create(sw, new XmlWriterSettings() { OmitXmlDeclaration = true });

serializer.Serialize(xmlWriter, model, ns);
string xml = sw.ToString(); 

输出:

<ArrayOfTicket>
  <Ticket>
    <CitationNumber>a</CitationNumber>
    <Amount>1</Amount>
  </Ticket>
  <Ticket>
    <CitationNumber>b</CitationNumber>
    <Amount>2</Amount>
  </Ticket>
</ArrayOfTicket>

PS:我在XmlWriterSettings 中添加了Indent = true 以获得上述输出

【讨论】:

  • 很好的答案。这正是我所需要的。是否可以更改默认根节点ArrayOfTicket
  • @Blaise 虽然我不喜欢“人们用新问题扩展他们的问题”(当原始问题得到回答时),但这就是你可以做到的。 var serializer = new XmlSerializer(typeof(List&lt;Ticket&gt;), new XmlRootAttribute("Tickets"));
  • 我可能确实对一个问题提出了太多要求。不过非常感谢。
  • @L.B serializer.Serialize(xmlWriter, model, ns); 这里的模型是什么,因为当我运行此代码时,我遇到了转换错误
  • @ArijitMukherjee 查看问题。是List&lt;Ticket&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-06
  • 1970-01-01
  • 2022-01-24
  • 2010-09-20
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多