Ahh ... deixa pra lá. É sempre a busca depois que a pergunta é feita que produz a resposta. Meu objeto que está sendo serializado está obj
e já foi definido. Adicionar um XMLSerializerNamespace com um único namespace vazio à coleção resolve o problema.
Em VB assim:
Dim xs As New XmlSerializer(GetType(cEmploymentDetail))
Dim ns As New XmlSerializerNamespaces()
ns.Add("", "")
Dim settings As New XmlWriterSettings()
settings.OmitXmlDeclaration = True
Using ms As New MemoryStream(), _
sw As XmlWriter = XmlWriter.Create(ms, settings), _
sr As New StreamReader(ms)
xs.Serialize(sw, obj, ns)
ms.Position = 0
Console.WriteLine(sr.ReadToEnd())
End Using
em C # assim:
//Create our own namespaces for the output
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
//Add an empty namespace and empty value
ns.Add("", "");
//Create the serializer
XmlSerializer slz = new XmlSerializer(someType);
//Serialize the object with our own namespaces (notice the overload)
slz.Serialize(myXmlTextWriter, someObject, ns);
q1
porcaria?Se você quiser se livrar do extra
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
exmlns:xsd="http://www.w3.org/2001/XMLSchema"
, mas ainda manter seu próprio namespacexmlns="http://schemas.YourCompany.com/YourSchema/"
, use o mesmo código acima, exceto por esta mudança simples:fonte
Se você deseja remover o namespace, você também pode remover a versão, para evitar a pesquisa, adicionei essa funcionalidade para que o código abaixo faça as duas coisas.
Também o envolvi em um método genérico, pois estou criando arquivos xml muito grandes para serializar na memória, portanto, dividi meu arquivo de saída e o serializei em "pedaços" menores:
fonte
StringWriter
padrão é a codificação UTF-16, que pode levar a problemas de desserialização no fluxo.using (var reader = XmlReader.Create(stream)){ reader.Read(); }
Isso lança uma exceção porque a declaração afirma que é UTF-16, enquanto o conteúdo foi realmente escrito como UTF-8.System.Xml.XmlException: 'There is no Unicode byte order mark. Cannot switch to Unicode.'
XmlReader
, você pode usarvar streamReader = new StreamReader(stream, System.Text.Encoding.UTF8, true);
O verdadeiro usará o BOM se encontrado, caso contrário, o padrão fornecido por você.Eu sugiro esta classe auxiliar:
:)
fonte
new XmlSerializerNamespaces(new[] {XmlQualifiedName.Empty})
vez denew XmlSerializerNamespaces(new[] {new XmlQualifiedName("", "")})
é uma maneira intencionalmente mais clara de codificá-lo, na minha opinião.Se você não conseguir se livrar de atributos xmlns extras para cada elemento, ao serializar para xml a partir de classes geradas (por exemplo: quando xsd.exe foi usado), então você tem algo como:
então eu compartilharia com você o que funcionou para mim (uma mistura de respostas anteriores e o que encontrei aqui )
defina explicitamente todos os seus xmlns diferentes da seguinte maneira:
em seguida, passe para o serializar
vocêterá os três namespaces declarados no elemento raiz e não precisa mais ser gerado nos outros elementos que serão prefixados de acordo
fonte
fonte