2009-07-09 7 views
3

Je réalise un pré-traitement d'un document XML dans un service Web ASMX (Legacy .NET SOAP Service) pour une utilisation ultérieure dans un frontal Silverlight.Conserver les espaces/sauts de ligne lors de la sérialisation via le service Web ASMX

Je suis en train de traiter ce document XML dans un objet POCO pour en faciliter l'utilisation. L'objet est défini comme suit:

public class CACDocument : ITextDocument 
{ 
    #region Properties 
    public string Title { get; set; } 
    public string Text { get; set; } 
    public List<Code> CodeList { get; set; } 
    public XElement FormatedText { get; set; } 
    #endregion 

    #region Constructor 
    public CACDocument() 
    { 
     CodeList = new List<Code>(); 
    } 
    #endregion 
} 

La propriété Text dans cet objet contient du texte essentiellement formaté (sauts de ligne, espace blanc, etc ...). Le noeud XML qui alimente cette propriété ressemble à ceci:

<text> 
    A TITLE FOLLOWED BY two line breaks 


    Some text followed by a line break 

    Some more text that might extend for a paragraph or two followed by more line breaks 

    Still more text 
</text> 

Tout est très bien et le format est maintenu comme j'attendre jusqu'à unitl les services Web sérialise les données à envoyer vers l'avant. Je suppose que dans le but d'optimiser la bande passante, l'objet sérialisé supprime les espaces et les sauts de ligne supplémentaires de la propriété Text avant de l'envoyer. Dans ce cas particulier, ce formatage est important. Existe-t-il un moyen de forcer le webservice à maintenir ce formatage espace/saut de ligne? J'imagine que je code un peu de codage pour les éléments en question, puis je me reconvertis sur le front-end, mais cela me semble un peu un kludge.

Répondre

5

Vous pouvez sérialiser comme une section CDATA:

[XmlIgnore] 
    public string Text { get; set; } 

    private static readonly XmlDocument _xmlDoc = new XmlDocument(); 

    [XmlElement("Text")] 
    public XmlCDataSection TextCData 
    { 
     get 
     { 
      return _xmlDoc.CreateCDataSection(Text); 
     } 
     set 
     { 
      Text = value.Data; 
     } 
    } 

Le texte sera sérialisé comme ça:

<text><![CDATA[A TITLE FOLLOWED BY two line breaks 


    Some text followed by a line break 

    Some more text that might extend for a paragraph or two followed by more line breaks 

    Still more text]]></text> 
+0

Quel est l'effet de toutes ces sections CData attachées au document? Et, est-ce thread-safe? –

+0

Pour être honnête, je n'ai aucune idée ... peut-être que le XmlDocument devrait être une variable locale à la place, je voulais juste éviter de créer de nombreuses instances de XmlDocument. –

2

Je présume que vous faites référence aux services Web ASMX?

En fait, je ne pense pas qu'il existe un moyen de le faire sans sérialiser comme un tableau d'octets. Alternativement, vous pouvez implémenter IXmlSerializable et faire tout le travail vous-même.


Vous voulez quelque chose comme ceci:

public class CACDocument : ITextDocument { 
    // ... 
    [XmlIgnore] 
    public string Text {get;set;} 

    [XmlText] 
    public byte[] TextSubstitute { 
     get {return System.Text.Encoding.UTF8.GetBytes(Text);} 
     set {Text = System.Text.Encoding.UTF8.GetString(value);} 
    } 
} 

Ce n'est pas testé, mais vous aurez l'idée. Vous pouvez également utiliser [XmlElement] au lieu de [XmlText] et spécifier un autre nom d'élément.

+0

Vous avez raison dans votre hypothèse. Ainsi, dites-vous que j'ai besoin de convertir la propriété de chaîne en propriété de tableau d'octets, ou existe-t-il un paramètre spécifique qui me permettra de sérialiser explicitement une chaîne en tant que tableau d'octets? –

+0

Steve, je suis curieux - avez-vous essayé la solution CDATA de Thomas ci-dessous? Je n'ai pas eu l'occasion de l'essayer. –

+0

Igot rattrapé dans les réunions hier. Je vais essayer sa solution aujourd'hui et commenterai plus tard. –

Questions connexes