Czy istnieje sposób na serializowanie obiektu w .NET bez automatycznej serializacji przestrzeni nazw XML? Wygląda na to, że domyślnie .NET uważa, że obszary nazw XSI i XSD powinny być uwzględnione, ale nie chcę ich tam.
109
Czy istnieje sposób na serializowanie obiektu w .NET bez automatycznej serializacji przestrzeni nazw XML? Wygląda na to, że domyślnie .NET uważa, że obszary nazw XSI i XSD powinny być uwzględnione, ale nie chcę ich tam.
Ahh ... nieważne. Zawsze szukanie po zadaniu pytania daje odpowiedź. Mój obiekt, który jest serializowany, jest obj
i został już zdefiniowany. Dodanie XMLSerializerNamespace z pojedynczą pustą przestrzenią nazw do kolekcji załatwia sprawę.
W VB w ten sposób:
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
w C # w ten sposób:
//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
gówna?Jeśli chcesz pozbyć się tego dodatkowego
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
ixmlns:xsd="http://www.w3.org/2001/XMLSchema"
zachować własną przestrzeń nazwxmlns="http://schemas.YourCompany.com/YourSchema/"
, używasz tego samego kodu co powyżej, z wyjątkiem tej prostej zmiany:źródło
Jeśli chcesz usunąć przestrzeń nazw, możesz również usunąć wersję, aby zaoszczędzić na wyszukiwaniu, dodałem tę funkcjonalność, więc poniższy kod będzie spełniał obie te funkcje.
Zapakowałem to również w ogólną metodę, ponieważ tworzę bardzo duże pliki xml, które są zbyt duże, aby można je było serializować w pamięci, więc zepsułem mój plik wyjściowy i serializuję go w mniejszych „kawałkach”:
źródło
StringWriter
domyślnie kodowanie UTF-16 może prowadzić do problemów z deserializacją.using (var reader = XmlReader.Create(stream)){ reader.Read(); }
Powoduje to zgłoszenie wyjątku, ponieważ deklaracja stwierdza, że jest to UTF-16, podczas gdy zawartość została faktycznie zapisana jako UTF-8.System.Xml.XmlException: 'There is no Unicode byte order mark. Cannot switch to Unicode.'
XmlReader
, możesz użyć opcjivar streamReader = new StreamReader(stream, System.Text.Encoding.UTF8, true);
Prawda użyje zestawienia komponentów, jeśli zostanie znaleziony, w przeciwnym razie wartość domyślna, którą podasz.Proponuję tę klasę pomocniczą:
:)
źródło
new XmlSerializerNamespaces(new[] {XmlQualifiedName.Empty})
zamiast pisanianew XmlSerializerNamespaces(new[] {new XmlQualifiedName("", "")})
jest celowo jaśniejszym sposobem kodowania.Jeśli nie możesz pozbyć się dodatkowych atrybutów xmlns dla każdego elementu, podczas serializacji do xml z wygenerowanych klas (np .: gdy został użyty xsd.exe ), to masz coś takiego:
następnie podzielę się z tobą tym, co zadziałało dla mnie (mieszanka poprzednich odpowiedzi i tego, co tutaj znalazłem )
jawnie ustaw wszystkie swoje różne xmlns w następujący sposób:
następnie przekaż go do serializacji
będziesz mieć trzy przestrzenie nazw zadeklarowane w elemencie głównym i nie będzie już konieczne ich generowanie w innych elementach, które zostaną odpowiednio poprzedzone
źródło
źródło