Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

C# - XML Serializer - Child elements als parent elements

Pagina: 1
Acties:

  • francoski
  • Registratie: Juni 2010
  • Niet online
Beste devvers,

Stel ik heb in c# dit:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Serializable]
public class A 
{
    [XmlAttribute("Lorum")]
    public string paramA { get; set; }
}

[Serializable]
public class B 
{
    [XmlAttribute("Ipsum")]
    public string paramB { get; set; }

    public A extraInfo { get; set;}
}


En dan haal ik een instantie van B door XmlSerializer heen, zo:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        public static string ObjectToXml(object inputObject){
            using (var memoryStream = new MemoryStream())
            {
                var xs = new XmlSerializer(inputObject.GetType());
                using (var xmlWriter = XmlWriter.Create(memoryStream))
                {
                    try
                    {
                        xs.Serialize(xmlWriter, inputObject);
                    }
                    catch (InvalidOperationException ex)
                    {
                    } 
                    var xml = Encoding.UTF8.GetString(memoryStream.ToArray());
                }
            }
        }


Dan krijg ik:
XML:
1
2
3
4
5
6
<B>
    <ipsum>iets</ipsum>
   <extraInfo>
        <lorum>nogiets</lorum>
   </extraInfo>
</B>


Maar ik wil graag:
XML:
1
2
3
4
<B>
    <ipsum>iets</ipsum>
    <lorum>nogiets</lorum>
</B>


Is dit op een manier mogelijk? Kan het niet vinden op google helaas.

ps: ongeteste code, gaat om het idee.

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 18-11 20:57
Is dat mogelijk? Ja, door zelfs ISerializable of IXmlSerializable te gaan implementeren. ;)

We are shaping the future


  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Schrijf een wrapper class?

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class FooBar
{
    public static Wrapper WrapB(B b)
    {
        return new Wrapper(b);
    }
}

[DataContract]
public class Wrapper 
{
    public Wrapper(B b)
    {
        this.ipsum = b.paramB;
        this.lorum = b.extraInfo.paramA;
    }

    [DataMember]
    public string lorum { get; set; }
    
     [DataMember]
     public string ipsum { get; set; }
}

Going for adventure, lots of sun and a convertible! | GMT-8


  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 20-11 13:38

sopsop

[v] [;,,;] [v]

Niet geprobeerd, maar als je nu dit doet:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Serializable] 
public class A  
{ 
    [XmlAttribute("Lorum")] 
    public string paramA { get; set; } 
} 

[Serializable] 
public class B  
{ 
    [XmlAttribute("Ipsum")] 
    public string paramB { get; set; } 

    [XmlElement(Type = typeof(A))]
    public A extraInfo { get; set;} 
}


Of werkt dat alleen bij lists?

Nevermind, dit werkt niet. zie de post van Alex)

[ Voor 10% gewijzigd door sopsop op 15-05-2014 13:52 ]


  • francoski
  • Registratie: Juni 2010
  • Niet online
Thanks voor de tip. Doe nu dit:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[Serializable]
public class flatAB 
{
    private A _parA;
    private B _parB;

    public flatAB(A parA, B parB)
    {
        _parA = parA;
        _parB = parB;
    }

    [XmlAttribute("ParALorum")]
    public string lorum { get { return _parA.lorum; } }

    [XmlAttribute("ParBIpsum")]
    public string ipsum { get { return _parB.ipsum; } }

}

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Kan je class A niet extenden?

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router

Pagina: 1