Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Gerar atributo no arquivo XML

Gostaria de saber como inserir atributos no arquivo xml gerado. por exemplo:

        <Invoice>
            <ID schemeID="token">351</ID>
            <TypeCode>388</TypeCode>
        </Invoice>

Preciso que, ao converter em xml, gerar o atributo schemeID="token" no arquivo xml convertido.

8 respostas

Oi Renato, tudo bem?

Nesse caso, você precisa de um XmlAttribute, definindo o AttributeName como "schemeID":

public class Invoice
{
    [XmlAttribute(AttributeName="schemeID")]
    public int ID { get; set; }

    public int TypeCode { get; set; }
}

Ótimo, muito obrigado!!!

Eu que agradeço, Renato, obrigado por participar do fórum!

solução

Oi Renato, agora percebi que minha resposta estava errada.

Faça o seguinte:

Entre no site https://xmltocsharp.azurewebsites.net/

Ele permite que você converta um trecho de código XML em uma ou mais classes .NET para serem serializadas.

Então o código XML...

        <Invoice>
            <ID schemeID="token">351</ID>
            <TypeCode>388</TypeCode>
        </Invoice>

... gera 2 classes:

     [XmlRoot(ElementName = "ID")]
    public class ID
    {
        [XmlAttribute(AttributeName = "schemeID")]
        public string SchemeID { get; set; }
        [XmlText]
        public int Value { get; set; }
    }

    [XmlRoot(ElementName = "Invoice")]
    public class Invoice
    {
        [XmlElement(ElementName = "ID")]
        public ID ID { get; set; }
        [XmlElement(ElementName = "TypeCode")]
        public int TypeCode { get; set; }
    }

Note que o ID precisa ser uma classe, pois ele vai conter não só o valor dentro da tag XML, mas também o valor do atributo schemeID.

para testar, usei o código C#:

            Invoice invoice = new Invoice
            {
                ID = new ID { SchemeID = "token", Value = 351 },
                TypeCode = 388
            };

            XmlSerializer serializer = new XmlSerializer(typeof(Invoice));
            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
            ns.Add("", "");

            using (var fileStream = new FileStream("Invoice.xml", FileMode.Create, FileAccess.Write))
            {
                serializer.Serialize(fileStream, invoice, ns);
            }

Isso me retorna o XML:

<?xml version="1.0"?>
<Invoice>
  <ID schemeID="token">351</ID>
  <TypeCode>388</TypeCode>
</Invoice>

Obs.: o trecho abaixo é usado para remover o namespace do XML gerado:

            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
            ns.Add("", "");

Agora funcionou perfeitamente. Obrigado mais uma vez.

Prezado, gostaria de saber como é possível inserir estes atributos (xmlns:ds, xsi:schemaLocation) no arquivo xml.

<?xml version="1.0" encoding="UTF-8"?>
<Declaration 
xmlns:ds="urn:wco:datamodel:WCO:GoodsDeclaration_DS:1"
    xmlns="urn:wco:datamodel:WCO:GoodsDeclaration:1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="urn:wco:datamodel:WCO:GoodsDeclaration:1 GoodsDeclaration_1p0_DUE.xsd ">

Desde já, obrigado.

Oi Renato,

Para gerar este xml:

<?xml version="1.0" encoding="UTF-8"?>
<Declaration 
xmlns:ds="urn:wco:datamodel:WCO:GoodsDeclaration_DS:1"
    xmlns="urn:wco:datamodel:WCO:GoodsDeclaration:1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="urn:wco:datamodel:WCO:GoodsDeclaration:1 GoodsDeclaration_1p0_DUE.xsd "></Declaration>

entrei nesta página para gerar o código C# necessário:

https://xmltocsharp.azurewebsites.net/

   /* 
    Licensed under the Apache License, Version 2.0

    http://www.apache.org/licenses/LICENSE-2.0
    */
using System;
using System.Xml.Serialization;
using System.Collections.Generic;
namespace Xml2CSharp
{
    [XmlRoot(ElementName="Declaration", Namespace="urn:wco:datamodel:WCO:GoodsDeclaration:1")]
    public class Declaration {
        [XmlAttribute(AttributeName="ds", Namespace="http://www.w3.org/2000/xmlns/")]
        public string Ds { get; set; }
        [XmlAttribute(AttributeName="xmlns")]
        public string Xmlns { get; set; }
        [XmlAttribute(AttributeName="xsi", Namespace="http://www.w3.org/2000/xmlns/")]
        public string Xsi { get; set; }
        [XmlAttribute(AttributeName="schemaLocation", Namespace="http://www.w3.org/2001/XMLSchema-instance")]
        public string SchemaLocation { get; set; }
    }

}

Não fiz o teste, mas basta você preencher a classe Declaration adequadamente, que o seu XML será gerado.

Obrigado mais uma vez.