Ao gerar XML a partir de XmlDocument em .NET, um xmlns
atributo em branco aparece na primeira vez que um elemento sem um namespace associado é inserido; Como isto pode ser evitado?
Exemplo:
XmlDocument xml = new XmlDocument();
xml.AppendChild(xml.CreateElement("root",
"whatever:name-space-1.0"));
xml.DocumentElement.AppendChild(xml.CreateElement("loner"));
Console.WriteLine(xml.OuterXml);
Resultado:
<root xmlns="whatever:name-space-1.0"><loner xmlns="" /></root>
Resultado desejado :
<root xmlns="whatever:name-space-1.0"><loner /></root>
Existe uma solução aplicável ao XmlDocument
código, não algo que ocorre após a conversão do documento em uma string com OuterXml
?
Meu raciocínio para fazer isso é ver se posso corresponder ao XML padrão de um protocolo específico usando XML gerado por XmlDocument. O xmlns
atributo em branco pode não quebrar ou confundir um analisador, mas também não está presente em nenhum uso que eu tenha visto desse protocolo.
fonte
doc.DocumentElement.NamespaceURI
), mas não especifique um namespace paraCreateAttribute()
oxmlns:psomething
mesmo que seja o mesmo uri.Esta é uma variante da resposta de JeniT (muito, muito obrigado!)
Isso elimina a necessidade de copiar ou repetir o namespace em todos os lugares.
fonte
Se o
<loner>
elemento em seu XML de amostra não tivesse axmlns
declaração de namespace padrão nele, ele estaria nowhatever:name-space-1.0
namespace em vez de estar em nenhum namespace. Se é isso que você deseja, você precisa criar o elemento nesse namespace:Se você quiser que o
<loner>
elemento não esteja em nenhum namespace, o XML que foi produzido é exatamente o que você precisa e você não deve se preocupar com oxmlns
atributo que foi adicionado automaticamente para você.fonte
Uma vez que root está em um namespace sem prefixo, qualquer filho de root que deseja remover o namespace deve ter a saída como seu exemplo. A solução seria prefixar o elemento raiz da seguinte forma:
código:
fonte
Se possível, crie uma classe de serialização e faça:
É mais seguro e você pode controlar os namespaces com atributos se realmente precisar de mais controle.
fonte
Resolvi o problema usando o padrão de fábrica. Criei uma fábrica para objetos XElement. Como parâmetro para a instanciação da fábrica, especifiquei um objeto XNamespace. Portanto, toda vez que um XElement é criado pela fábrica, o namespace será adicionado automaticamente. Aqui está o código da fábrica:
fonte
XmlDocument
, nãoXDocument
.Sim, você pode impedir o XMLNS do XmlElement. A hora da primeira criação está chegando: assim
Altere o código: e passe o namespace xml assim
Código C #:
fonte