Como posso gerar XML válido em c #?
Depende do cenário. XmlSerializer
é certamente uma maneira e tem a vantagem de mapear diretamente para um modelo de objeto. No .NET 3.5, XDocument
etc. também são muito amigáveis. Se o tamanho é muito grande, então XmlWriter
é seu amigo.
Por XDocument
exemplo:
Console.WriteLine(
new XElement("Foo",
new XAttribute("Bar", "some & value"),
new XElement("Nested", "data")));
Ou o mesmo com XmlDocument
:
XmlDocument doc = new XmlDocument();
XmlElement el = (XmlElement)doc.AppendChild(doc.CreateElement("Foo"));
el.SetAttribute("Bar", "some & value");
el.AppendChild(doc.CreateElement("Nested")).InnerText = "data";
Console.WriteLine(doc.OuterXml);
Se você estiver gravando um grande fluxo de dados, qualquer uma das abordagens do DOM (como XmlDocument
/ XDocument
, etc.) consumirá rapidamente muita memória. Portanto, se você estiver gravando um arquivo XML de 100 MB a partir do CSV , considere XmlWriter
; isso é mais primitivo (uma mangueira de fogo de gravação única), mas muito eficiente (imagine um grande loop aqui):
XmlWriter writer = XmlWriter.Create(Console.Out);
writer.WriteStartElement("Foo");
writer.WriteAttributeString("Bar", "Some & value");
writer.WriteElementString("Nested", "data");
writer.WriteEndElement();
Finalmente, via XmlSerializer
:
[Serializable]
public class Foo
{
[XmlAttribute]
public string Bar { get; set; }
public string Nested { get; set; }
}
...
Foo foo = new Foo
{
Bar = "some & value",
Nested = "data"
};
new XmlSerializer(typeof(Foo)).Serialize(Console.Out, foo);
Este é um bom modelo para mapear para classes, etc .; no entanto, pode ser um exagero se você estiver fazendo algo simples (ou se o XML desejado realmente não tiver uma correlação direta com o modelo de objeto). Outro problema XmlSerializer
é que ele não gosta de serializar tipos imutáveis: tudo deve ter um getter e setter públicos (a menos que você faça tudo sozinho implementando IXmlSerializable
, nesse caso, você não ganhou muito usando XmlSerializer
).
A melhor coisa que tentei é o LINQ to XSD (que é desconhecido para a maioria dos desenvolvedores). Você fornece a ele um esquema XSD e ele gera um modelo de objeto fortemente tipado e perfeitamente mapeado (baseado em LINQ to XML) para você em segundo plano, o que é realmente fácil de se trabalhar - e atualiza e valida seu modelo de objeto e XML em tempo real. Embora ainda seja "Preview", não encontrei nenhum bug com ele.
Se você tiver um esquema XSD parecido com este:
Então você pode simplesmente criar XML como este:
Ou simplesmente carregue um XML do arquivo como este:
Ou salve-o assim:
rootElement.Untyped
também gera o elemento na forma de um XElement (de LINQ para XML).fonte
RootElement
fonte
XmlWriter é a maneira mais rápida de escrever um bom XML. XDocument, XMLDocument e alguns outros funcionam bem também, mas não são otimizados para escrever XML. Se você deseja escrever o XML o mais rápido possível, você definitivamente deve usar o XmlWriter.
fonte
No passado, criei meu esquema XML e, em seguida, usei uma ferramenta para gerar classes C # que serão serializadas para esse esquema. A ferramenta de definição de esquema XML é um exemplo
http://msdn.microsoft.com/en-us/library/x6c1kb0s(VS.71).aspx
fonte
Eu acho que esse recurso deve ser suficiente para um carregamento / salvamento moderado de XML: Leitura / gravação de XML usando C # .
Minha tarefa era armazenar notação musical. Escolho o XML, porque acho que o .NET amadureceu o suficiente para permitir uma solução fácil para a tarefa. Eu tinha razão :)
Este é o meu protótipo de arquivo de música:
Isso pode ser resolvido facilmente:
Para Salvar no arquivo:
Para carregar arquivo:
fonte
Para coisas simples, eu apenas uso as classes XmlDocument / XmlNode / XmlAttribute e o DOM XmlDocument encontrados no System.XML.
Ele gera o XML para mim, só preciso vincular alguns itens.
No entanto, em coisas maiores, eu uso serialização XML.
fonte
Para casos simples, eu também sugeriria olhar para o XmlOutput uma interface fluente para criar o Xml.
XmlOutput é ótimo para criação simples de XML, com código legível e de manutenção, enquanto gera um XML válido. O post original tem alguns ótimos exemplos.
fonte
Como acima.
Eu uso stringbuilder.append ().
Muito simples, e você pode executar xmldocument.load (objeto strinbuilder como parâmetro).
Você provavelmente se encontrará usando string.concat dentro do parâmetro append, mas essa é uma abordagem muito direta.
fonte