Como preencher uma árvore XML com um XmlWriter (LINQ to XML)
Uma maneira de preencher uma árvore XML é usar CreateWriter para criar um XmlWriter e escrever no XmlWriter. A árvore XML é preenchida com todos os nós que são escritos no XmlWriter.
Você normalmente usa este método quando usa LINQ to XML com outra classe que espera escrever em um XmlWriter, como, por exemplo, XslCompiledTransform.
Exemplo
Um uso possível para CreateWriter é ao chamar uma transformação XSLT. Este exemplo cria uma árvore XML, cria XmlReader da árvore XML, cria um novo documento e, em seguida, cria XmlWriter para gravar no novo documento. Ele então chama a transformação XSLT, passando no XmlReader e no XmlWriter. Depois que a transformação for concluída com êxito, a nova árvore XML será preenchida com os resultados da transformação.
string xslMarkup = @"<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
<xsl:template match='/Parent'>
<Root>
<C1>
<xsl:value-of select='Child1'/>
</C1>
<C2>
<xsl:value-of select='Child2'/>
</C2>
</Root>
</xsl:template>
</xsl:stylesheet>";
XDocument xmlTree = new XDocument(
new XElement("Parent",
new XElement("Child1", "Child1 data"),
new XElement("Child2", "Child2 data")
)
);
XDocument newTree = new XDocument();
using (XmlWriter writer = newTree.CreateWriter())
{
// Load the style sheet.
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(XmlReader.Create(new StringReader(xslMarkup)));
// Execute the transformation and output the results to a writer.
xslt.Transform(xmlTree.CreateReader(), writer);
}
Console.WriteLine(newTree);
Dim xslMarkup As XDocument = _
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
<xsl:template match='/Parent'>
<Root>
<C1>
<xsl:value-of select='Child1'/>
</C1>
<C2>
<xsl:value-of select='Child2'/>
</C2>
</Root>
</xsl:template>
</xsl:stylesheet>
Dim xmlTree As XDocument = _
<?xml version='1.0'?>
<Parent>
<Child1>Child1 data</Child1>
<Child2>Child2 data</Child2>
</Parent>
Dim newTree As XDocument = New XDocument()
Using writer As XmlWriter = newTree.CreateWriter()
' Load the style sheet.
Dim xslt As XslCompiledTransform = New XslCompiledTransform()
xslt.Load(xslMarkup.CreateReader())
' Execute the transformation and output the results to a writer.
xslt.Transform(xmlTree.CreateReader(), writer)
End Using
Console.WriteLine(newTree)
Este exemplo gera a seguinte saída:
<Root>
<C1>Child1 data</C1>
<C2>Child2 data</C2>
</Root>