» »

[C#] Xml Serializacija Attribut pred Namespace

[C#] Xml Serializacija Attribut pred Namespace

Shinobi ::

Pozdravljeni!

Imam problem, kateri mi bo spil vse živce. Uporabljam XmlSerializer zato mi
prosim ne odgovarjajte na temo XmlDocument, ker v tem primeru ne pride v poštev.

Začetek razreda:
[Serializable]
[XmlRoot(ElementName = "COLLADA", IsNullable = false)]    
public class DaeModel
{
	private const string DefaultNamespace = @"http://www.collada.org/2005/11/COLLADASchema";

	private string _version = "1.4.1";

	[XmlAttributeAttribute(AttributeName = "version", Namespace = DefaultNamespace)]
	public string Version
	{
		get { return _version; }
		set { _version = value; }
	}

Želim doseči to:
<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">


C# pa mi naredi:
<COLLADA version="1.4.1" xmlns="http://www.collada.org/2005/11/COLLADASchema">


Zakaj je version pred namespace?! Kako bi ga lahko postavil za namespace?

Koda za serializacijo v konzolo:
public void Save(string fileName)
{
	XmlWriterSettings settings = new XmlWriterSettings();
	settings.Indent = true;
	settings.Encoding = Encoding.UTF8;
	settings.OmitXmlDeclaration = false;

	XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
	namespaces.Add(string.Empty, DefaultNamespace);

	XmlWriter writer = XmlWriter.Create(Console.Out, settings);
	XmlSerializer serializer = new XmlSerializer(GetType(), DefaultNamespace);
	serializer.Serialize(writer, this, namespaces);
}

Spura ::

Zakaj je vrstni red pomemben?

Shinobi ::

Zaradi enih importerjev, ki so spisani v Cju in hardcoded berejo.

Sekundarni razlog:
vsi dokumenti so shranjeni tako, da je najprej namespace in potem attributi.

joze67 ::

Poskusi:
[Serializable]
[XmlRoot(ElementName = "COLLADA", IsNullable = false)]   
public class DaeModel
{
    [XmlAttribute(Order=1)]
    private const string DefaultNamespace = @"http://www.collada.org/2005/11/COLLADASchema";
 
    [XmlAttribute(Order=2)]
    private string _version = "1.4.1";
...

Shinobi ::

Hvala Jože! Sem že razmišljal v tej smeri, vendar "Order" ni del XmlAttributa. Žal.

joze67 ::

My bad.

Po krajšem prebiranju dokumentacije (pot, katero si verjetno že prehodil) bo morda potrebno pisati lastni serializer.

win64 ::

Sicer ena neučinkovita rešitev, preprosto ročno zamenjaš(String funkcije) vrstni red, po zapisu seveda.

Zgodovina sprememb…

  • spremenil: win64 ()

Ericssony ::

Na razredu, ki ga serializiraš uporabi interface IXmlSerializable in implementiraj metode:

    GetSchema() (ta naj vedno vrne vrednost null)
    ReadXml(XmlReader reader) in
    WriteXml(XmlWriter writer)


V WriteXml() metodi imaš zdaj možnost pisanja XML strukture vrstico za vrstico, isto tako pri branju.

nightrage ::

Uporabljaš kej xsd tool. Najprej si narediš xsd shemo recimo v xmlspy-ju, iz katere s pomočjo xsd tool-a narediš objekt, ki ga lahko serializiraš v string in iz stringa v objekt.
Vedno ti bo naredil string xml shemo kakršno ti definiraš v xsd-ju. In še malo dokumentacije link

Zgodovina sprememb…

Looooooka ::

IXmlSerializable implementacija.
Orderbya na xmlattributeattribute ni, ker order ni pomemben ze v xml definiciji.
Na tvojem mestu ne bi niti zgubljal casa s tem.Ce katera koli storitev/program ne zna parsat XML-ja zaradi vrstnega reda atributov je pokvarjane storitev/program in ne tvoja serializacija.
Ce se ti gre zgolj za estetiko...pljunit v roke in IXmlSerializable oz pisanje kodo, ki ti sama spise ta xml :)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C#] WPF vprašanja

Oddelek: Programiranje
101056 (678) Ciklamen
»

UserControl v Wrappanelu WPF

Oddelek: Programiranje
51060 (882) hurlimannxt
»

Prireditev class = class

Oddelek: Programiranje
131738 (1403) noraguta
»

VC# Zapis podatkov na disk

Oddelek: Programiranje
422404 (1660) matej_jack
»

[C#] Problem z XML

Oddelek: Programiranje
51296 (1190) RobyRob

Več podobnih tem