Używam tej metody serializować mojego obiektu:Jak kontrolować część serializacji xml przy użyciu .NET?
public static string XmlSerialize(object o)
{
var stringWriter = new StringWriter();
var xmlSerializer = new XmlSerializer(o.GetType());
xmlSerializer.Serialize(stringWriter, o);
string xml = stringWriter.ToString();
stringWriter.Close();
return xml;
}
To sprawia, XML, który zaczyna się tak:
<?xml version="1.0" encoding="utf-16"?>
<MyObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
Ale chcę, żeby wyglądać tak:
<?xml version = "1.0" encoding="Windows-1252" standalone="yes"?>
<MyObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
Jak więc zmienić kodowanie na Windows-1252 i ustawić standalone = yes? Dodatkowo, w jaki sposób uzyskać obiekt, aby wykluczyć wartość xmlns?
Widziałem kilka podobnych pytań, takich jak this one, ale miałem nadzieję, że może to być dla mnie prostsze, może ustawiając jakieś atrybuty?
Aktualizacja 2: Po przeanalizowaniu odpowiedzi i komentarzy Johna oraz przemyśleń na ten temat zdecydowałem się na drugą metodę. Nie sądzę, że tworzenie tego zwariowanego niestandardowego xml tylko dla trzeciej strony w jednym przypadku powinno być nazywane czymś tak ogólnym jak "XmlSerialize".
Więc stworzyłem drugą metodę, która pobiera dokument XML i najpierw usuwa jeden element namespace tak:
xElement.Attributes().Where(a => a.IsNamespaceDeclaration && a.Value == "http://www.w3.org/2001/XMLSchema").Remove();
wtedy, to zapisuje je do pliku XML z Jana kodu. Wreszcie zwraca że xml, po wyjściu z tego:
new XDeclaration("1.0", "Windows-1252", "yes").ToString()
I to jest brzydkie, ale robi mi dokładnie to, czego potrzebuję do tego 3rd party zrozumieć mój XML.
Naprawdę, użyj 'XmlReader.Create' i' XmlWriter.Create' zamiast 'XmlTextReader' i' XmlTextWriter'. Ponadto, musisz umieścić te rzeczy w blokach 'używając'. –
W końcu poszedłem z twoim kodem. Ale zastanawiam się, tak długo jak wszystko zamykam, czy nie jest tak dobre, jak używanie klocków? – Chris
Nie. Klocki 'using' zapewniają, że obiekty są usuwane, nawet jeśli występują wyjątki. –