Pergunta

Eu estou usando XmlTextWriter e seu método WriteElementString, por exemplo:

XmlTextWriter writer = new XmlTextWriter("filename.xml", null);

writer.WriteStartElement("User");
writer.WriteElementString("Username", inputUserName);
writer.WriteElementString("Email", inputEmail);
writer.WriteEndElement();

writer.Close();

A saída XML esperado é:

<User>
    <Username>value</Username>
    <Email>value</Email>
</User>

No entanto, se por exemplo inputEmail estiver vazio, o XML resultado eu recebo como o seguinte:

<User>
    <Username>value</Username>
    <Email/>
</User>

Considerando que eu esperaria que fosse:

<User>
    <Username>value</Username>
    <Email></Email>
</User>

O que estou fazendo de errado? Existe uma maneira de conseguir o meu resultado esperado de uma forma simples usando XmlTextWriter?

Foi útil?

Solução

A sua saída está correta. Um elemento sem conteúdo deve ser escrito como <tag/>.

Você pode forçar o uso da tag completa chamando WriteFullEndElement ()

writer.WriteStartElement("Email");
writer.WriteString(inputEmail);
writer.WriteFullEndElement();

Isso <Email></Email> saída vontade quando inputEmail está vazio.

Se você quiser fazer isso mais de uma vez, você pode criar um método de extensão:

public static void WriteFullElementString(this XmlTextWriter writer,
                                          string localName, 
                                          string value)
{
    writer.WriteStartElement(localName);
    writer.WriteString(value);
    writer.WriteFullEndElement();
}

Em seguida, o código seria:

writer.WriteStartElement("User");
writer.WriteFullElementString("Username", inputUserName);
writer.WriteFullElementString("Email", inputEmail);
writer.WriteEndElement();

Outras dicas

Ele não falha <Tag/> é apenas um atalho para <Tag></Tag>

O código deve ser:

using (XmlWriter writer = XmlWriter.Create("filename.xml"))
{
    writer.WriteStartElement("User");
    writer.WriteElementString("Username", inputUserName);
    writer.WriteElementString("Email", inputEmail);
    writer.WriteEndElement();
}

Este recurso evita vazamentos em caso de exceções, e usa a maneira correta de criar um XmlReader (desde .NET 2.0).

Deixando isso aqui no caso de alguém precisa dele; uma vez que nenhuma das respostas acima resolvido para mim, ou parecia ser um exagero.

FileStream fs = new FileStream("file.xml", FileMode.Create);

XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;

XmlWriter w = XmlWriter.Create(fs, settings);
w.WriteStartDocument();
w.WriteStartElement("tag1");
w.WriteStartElement("tag2");
w.WriteAttributeString("attr1", "val1");
w.WriteAttributeString("attr2", "val2");
w.WriteFullEndElement();
w.WriteEndElement();
w.WriteEndDocument();

w.Flush();
fs.Close();

O truque era para definir o XmlWriterSettings.Indent = true e adicioná-lo à XmlWriter .

Editar:

Como alternativa, você também pode usar

w.Formatting = Formatting.Indented;

em vez de adicionar um XmlWriterSettings.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top