Ahh ... no importa. Siempre es la búsqueda después de que se plantea la pregunta lo que da la respuesta. Mi objeto que se está serializando está obj
y ya se ha definido. Agregar un XMLSerializerNamespace con un solo espacio de nombres vacío a la colección hace el truco.
En VB así:
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
en C # así:
//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
basura?Si desea deshacerse del extra
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
yxmlns:xsd="http://www.w3.org/2001/XMLSchema"
, pero aún conserva su propio espacio de nombresxmlns="http://schemas.YourCompany.com/YourSchema/"
, use el mismo código que el anterior, excepto por este simple cambio:fuente
Si desea eliminar el espacio de nombres, es posible que también desee eliminar la versión, para evitar la búsqueda, agregué esa funcionalidad, por lo que el código a continuación hará ambas cosas.
También lo he incluido en un método genérico, ya que estoy creando archivos xml muy grandes que son demasiado grandes para serializar en la memoria, así que he dividido mi archivo de salida y lo serializo en "trozos" más pequeños:
fuente
StringWriter
predeterminado es la codificación UTF-16, lo que puede provocar problemas de deserialización en sentido descendente.using (var reader = XmlReader.Create(stream)){ reader.Read(); }
Esto genera una excepción porque la declaración indica que es UTF-16, mientras que el contenido en realidad se escribió como UTF-8.System.Xml.XmlException: 'There is no Unicode byte order mark. Cannot switch to Unicode.'
XmlReader
, puede utilizarvar streamReader = new StreamReader(stream, System.Text.Encoding.UTF8, true);
El verdadero utilizará la lista de materiales si se encuentra, de lo contrario, el predeterminado que proporcione.Sugiero esta clase de ayuda:
:)
fuente
new XmlSerializerNamespaces(new[] {XmlQualifiedName.Empty})
lugar denew XmlSerializerNamespaces(new[] {new XmlQualifiedName("", "")})
es una forma intencionalmente más clara de codificarlo, en mi opinión.Si no puede deshacerse de los atributos xmlns adicionales para cada elemento, al serializar a xml desde clases generadas (por ejemplo: cuando se usó xsd.exe ), entonces tiene algo como:
luego compartiría con ustedes lo que funcionó para mí (una combinación de respuestas anteriores y lo que encontré aquí )
establezca explícitamente todos sus xmlns diferentes de la siguiente manera:
luego pasarlo a serializar
tendrá los tres espacios de nombres declarados en el elemento raíz y no será necesario generar más en los otros elementos que se prefijarán en consecuencia
fuente
fuente