2009-07-22 6 views
6

ich eine sehr spezifische Deserialisierung Notwendigkeit haben, siehe unten Beispiel:Kann die .NET XmlSerializer-Klasse InnerXml als Zeichenfolge deserialisieren?

sage ich folgende Klasse haben:

[Serializable]
public class Person {
public string Name { get; set; }
public string PersonXml { get; set; }
}

und folgende XML

 
<Person> 
    <Name>John</Name> 
    <PersonXml><someXmlFragment>text</someXmlFragment></PersonXml> 
</Person> 

Was ich will, ist die XmlSerializer-Klasse Deserialize InnerXml des Elements <PersonXml> Element zu der PersonXml-Eigenschaft als eine Zeichenfolge. Ich frage mich, ob es gemacht werden kann.

HINWEIS: weiß ich, ich den Inhalt <PersonXml> illegal XML Zeichen zu entkommen kodieren kann, aber ich würde es vorziehen, die innere XML menschlichere freundlich (nicht enthalten & lt zu verlassen, und andere Einheiten, die nur mein Ende wird cofuse user)

Antwort

3

Sie können immer implementieren IXmlSerializable und tun, was immer Sie wollen durch XmlReader.

+0

Richtig, ich habe nicht so Weg betrachten. Das würde definitiv mein Problem lösen, obwohl ich auf eine billigere Lösung gehofft hatte :) Danke! –

+0

BTW, Sie benötigen [Serializable] für die XML-Serialisierung nicht. [XmlElemenht ("Name")] kann auch weggelassen werden, da in diesem speziellen Fall das Standardverhalten von XMLSerializer nicht geändert wird. –

1

Also, obwohl das Element tatsächlich XML-Elemente enthält, soll .NET so tun, als sei es wirklich eine Zeichenkette? Ich denke nicht, dass dies durch Standard-Serialisierung möglich ist.

Sie könnten jedoch die XML-Datei laden, die PersonXml-Datei transformieren und ordnungsgemäß entschlüsseln und dann den Inhalt von PersonXml durch die neu maskierten Daten ersetzen. Es würde bedeuten, den XML-Code vor der Deserialisierung manuell zu manipulieren, aber dann könnten Sie die XML-Elemente unter dem PersonXml-Code behalten.

+0

Ja, aber dies scheint mir, wie zu viel Aufwand und eine ziemlich hässliche Lösung :) –

0

Warum XML nicht zur Darstellung von XML verwenden? Verwenden Sie einfach XmlElement für PersonXml.

Es ist immer eine schlechte Idee, so zu tun, dass XML dasselbe ist wie String.

0

Der Beitrag ist alt, aber als ich nach einer Lösung suchte und vielleicht meine Antwort könnte jemandem helfen.

Was

[XmlText] 
public string PersonXml { get; set; } 

Dies wird nicht Ihr Problem lösen, aber vielleicht könnte es eine akzeptable Alternative sein.

In meinem Fall ist die PersonXml ein "nice-to-have-Element", das nicht immer Xml enthält. [XmlText] bewirkt, dass PersonXml null ist, wenn PersonXml Xml enthält. Wenn jedoch PersonXml Text ohne Xml enthält, ist die Deserialisierung korrekt.

In meinem Fall ohne [XmlText] verursacht das Xml in PersonXml Elemente, bevor PersonXml korrekt deserialisiert wird, aber Elemente nach PersonXml werden falsch deserialisiert.

0

Ich stapfte auf diese Antwort bei der Suche nach ähnlichen Lösung. Ich wollte IXmlSerializable nicht verwenden.

Also, als Referenz, wenn jemand dieses Problem in Zukunft sieht, können Sie XmlAnyElement Attribut verwenden, um innere Xml als XmlNode zu serialisieren. Sie können dann den XmlNode nach Bedarf weiterverarbeiten, die Serialisierung separat ausführen oder einfach den Text von XML nach Bedarf abrufen.

Für dieses Beispiel:

public class Person 
{ 

    public string Name { get; set; } 

    [XmlAnyElement] 
    public XmlNode PersonXml { get; set; } 

} 
+0

Es lohnt sich auch, das Attribut [XmlText] zu PersonXml hinzuzufügen. Dies umfasst und Textknoten, die untergeordnete Knoten des Knotens sind – user2346593

Verwandte Themen