Pergunta

Eu encontrei um problema no qual, quando eu criar um documento XML por meio de programação usando as classes System.XML e, em seguida, usar o método Save the XML saída não usar QNames para os nós e apenas usa nomes locais.

por exemplo, saída desejada

<ex:root>
  <ex:something attr:name="value">
</ex:root>

Mas o que eu atualmente recebe é

<root>
  <something name="value">
</root>

Este é um tanto simplificada uma vez que todos os espaços de nomes que estou usando estão sendo totalmente definido usando xmlns atributos no elemento documento, mas omiti que para maior clareza aqui.

Estou ciente de que a classe XmlWriter pode ser usado para salvar um XmlDocument e que isso leva uma classe XmlWriterSettings mas eu não podia ver como configurar isso de tal forma que eu recebo saída QNames completo.

Foi útil?

Solução

Como você disse, o elemento raiz precisa da definição namespace:

<?xml version="1.0"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
    xmlns:iis="http://schemas.microsoft.com/wix/IIsExtension">
    <iis:WebSite Id="asdf" />
</Wix>

O código para o xml acima:

XmlDocument document = new XmlDocument();
document.AppendChild(document.CreateXmlDeclaration("1.0", null, null));
XmlNode rootNode = document.CreateElement("Wix", "http://schemas.microsoft.com/wix/2006/wi");
XmlAttribute attr = document.CreateAttribute("xmlns:iis", "http://www.w3.org/2000/xmlns/");
attr.Value = "http://schemas.microsoft.com/wix/IIsExtension";
rootNode.Attributes.Append(attr);
rootNode.AppendChild(document.CreateElement("iis:WebSite", "http://schemas.microsoft.com/wix/IIsExtension"));
document.AppendChild(rootNode);

A exigência de passar o URI como um argumento para os métodos CreateAttribute e CreateElement parece um contra-senso, porque pode-se argumentar que o documento é capaz de obter essa informação, mas hey, isso é como ele funciona.

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