【问题标题】:C# Xml Serialization nodesC# Xml 序列化节点
【发布时间】:2016-08-05 04:17:24
【问题描述】:

我有这些课程

public class ProdutosServicos
{           
    public List<Produto> Produto { get; set; }  
}

public class Produto
{
    public string Descricao { get; set; }        
    public CodigoTipo Codigo { get; set; }
    public string Quantidade { get; set; }
    public string Unidade { get; set; }
    public string ValorUnitario { get; set; }
}

并且 xml 正在像这样被序列化:

<ProdutosServicos>
   <Produto>
      <Produto>
        ...
      </Produto>
   </Produto>
</ProdutosServicos>

但我想这样生成:

<ProdutosServicos>
   <Produto>
    ...
   </Produto>
</ProdutosServicos>

在序列化过程中,我找不到任何 Xml 属性来放置属性以“删除”第一个 Produto 节点。

关于如何实现这一点的任何想法?

谢谢。

【问题讨论】:

  • 您的 POCO 类准确地代表了您在 XML 中的内容 - 如果您正在序列化 POCO,则生成的 XML 确实是正确的。所以问题是 - 是Produto a collection?如果是的话,你所能拥有的只是设置一个属性名称 - 复数形式 Produtos 那么你将拥有以下结构 &lt;Produtos&gt;&lt;Produto&gt;&lt;/Produto&gt;...&lt;/Produtos&gt; 。可能这可能会帮助你stackoverflow.com/questions/14967293/…
  • @JS_GodBlessAll,是的,Produto 是一个集合,我知道如果我将名称复数,它将成为 ,但要求是只有 =/,正是我上面的方式。

标签: c# xml-serialization


【解决方案1】:

只需在 List 属性中使用属性 XmlElement。像这样。

public class ProdutosServicos
{
    // This is the attribute that makes your XML Array looks like a list of XML Elements.
    [XmlElement]
    public List<Produto> Produto { get; set; }
}

结果会是这样的:

<?xml version="1.0" encoding="utf-16"?>
<ProdutosServicos xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Produto>
    ...
  </Produto>
  <Produto>
    ...
  </Produto>
  <Produto>
    ...
  </Produto>
</ProdutosServicos>

【讨论】:

    【解决方案2】:

    请看下面的解决方案,

    类定义

    [Serializable]
    [XmlRoot("ProdutosServicos")]
    public class ProdutosServicos
    {
        [XmlElement("Producto")]
        public List<Produto> Produto { get; set; }
    }
    
    [Serializable]
    public class Produto
    {
        public string Descricao { get; set; }
        public CodigoTipo Codigo { get; set; }
        public string Quantidade { get; set; }
        public string Unidade { get; set; }
        public string ValorUnitario { get; set; }
    }
    [Serializable]
    public class CodigoTipo
    {
    
    }
    

    要序列化的代码

    XmlSerializer serializer = new XmlSerializer(typeof(ProdutosServicos));
            var productoServices = new ProdutosServicos();
            Produto producto1 = new Produto();
            producto1.Descricao = "Descricao1";
            producto1.Quantidade = "Quantidade1";
            Produto producto2 = new Produto();
            producto2.Descricao = "Descricao2";
            producto2.Quantidade = "Quantidade2";
    
            List<Produto> collectionProducto = new List<Produto>();
            collectionProducto.Add(producto1);
            collectionProducto.Add(producto2);
            productoServices.Produto = collectionProducto;
    
            string xmlString = string.Empty;
            using (StringWriter stringWriter = new StringWriter())
            {
                using (XmlWriter writer = XmlWriter.Create(stringWriter))
                {
                    serializer.Serialize(writer, productoServices);
                    //String in required format
                    xmlString = stringWriter.ToString(); 
                }
            }
    

    XML 输出

    <?xml version="1.0" encoding="utf-16"?>
    <ProdutosServicos xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Producto>
        <Descricao>Descricao1</Descricao>
        <Quantidade>Quantidade1</Quantidade>
      </Producto>
      <Producto>
        <Descricao>Descricao2</Descricao>
        <Quantidade>Quantidade2</Quantidade>
      </Producto>
    </ProdutosServicos>
    

    【讨论】:

    • @Maturano 好的。很高兴知道。您还可以根据需要检查 XML 序列化和操作结果 XML 的各种方式。你可以从这里开始Introducing XML Serialization
    猜你喜欢
    • 2016-06-30
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 2022-06-27
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多