2011-08-29 4 views
1

essayant de désérialiser une chaîne de Xml, mais toujours obtenir problème pour des éléments comme ceux-ci:XML désérialiser les éléments null?

<Taxable /> 
<DefaultPurchasePrice /> 

Mon extrait de code C#:

[XmlRoot(ElementName = "Product", Namespace = "http://api.test.com/version/1", IsNullable = false)] 
public class Product 
{ 
    public Guid Guid { get; set; } 
    public string ProductName { get; set; } 
    public bool Taxable { get; set; } 
    public Decimal DefautSellPrice { get; set; } 
    [XmlElement("DefaultPurchasePrice")] 
    public string DefaultPurchasePriceElement 
    { 
     get 
     { 
      if (DefaultPurchasePrice == null) 
       return String.Empty; 
      else 
       return DefaultPurchasePrice.ToString(); 
     } 
     set 
     { 
      if (value == null | value.Length == 0) 
       DefaultPurchasePrice = null; 
      else 
       DefaultPurchasePrice = Convert.ToDecimal(value); 
     } 
    } 

    [XmlIgnore] 
    public decimal? DefaultPurchasePrice{ get; set;} 
} 

On dirait

xsi: nil = » true "

l'attribut au format XML doit résoudre mon problème. Mais comme nous utilisons XML fourni par un serveur REST dans le cadre d'un test d'API. Nous n'avons pas de contrôle direct sur la manière de construire le XML, mais nous pouvons leur donner des retours. Donc je pense que je devrais explicitement leur demander de corriger leur XML, car c'est le problème de leur XML, n'est-ce pas?

Dans le même temps, je pourrais obtenir des éléments individuels désérialisés par le code suivant:

[XmlElement("DefaultPurchasePrice")] 
public string DefaultPurchasePriceElement 
{ 
    get 
    { 
     if (DefaultPurchasePrice == null) 
      return String.Empty; 
     else 
      return DefaultPurchasePrice.ToString(); 
    } 
    set 
    { 
     if (value == null | value.Length == 0) 
       DefaultPurchasePrice = null; 
     else 
       DefaultPurchasePrice = Convert.ToDecimal(value); 
     } 
    } 

[XmlIgnore] 
public decimal? DefaultPurchasePrice{ get; set;} 

Mais il y en a plusieurs éléments nuls dans la chaîne XML, et encore une fois, l'autre partie peut fixer leur XML donc je n'ai pas besoin de faire quoi que ce soit à mon code désérialiser dans ce cas, n'est-ce pas? De toute façon, pourrais-je faire quelque chose dans mon code avant la désérialisation afin que le XML puisse avoir un attribut xsi: nil = "true" pour les éléments NULL afin que je n'aie pas besoin de faire grand chose dans mon code C# XML?

Je pense à la solution de Ryan @ dans le 2ème d'ici: deserialize-xml-with-empty-elements-in-c, mais vous ne savez pas s'il existe de meilleures solutions?

EDIT:

a juste fait un petit test, ajoutant xsi: Nill = 'true' dans des éléments XML NULL travailler bien avec mon code existant C#. Mais j'ai besoin de m'assurer que ma classe C# mappée à partir de XML a un type de données Nullable pour les éléments NULL provenant de XML avec xsi: nill = 'true'. Mais cela a du sens: quand un champ de données provenant de XML peut être un type nul, j'ai besoin de définir explicitement le type de données correspondant comme nul. Je suis très content de cela plutôt que de ma solution actuelle.

Répondre

0

Je ne connais pas la réponse à votre problème, mais il me semble que demander à vos collègues de corriger leur XML n'est pas la bonne réponse. Il est courant lors de l'écriture de réseau et de code de format de fichier pour "Soyez conservateur dans ce que vous donnez, mais en acceptant ce que vous recevez", ou une telle. En d'autres termes, vous devriez être prêt à recevoir à peu près RIEN dans votre flux XML entrant. Si le XML est bien formé et contient les éléments et les attributs dont vous avez besoin, vous devriez être capable de l'analyser correctement. Si elle comporte des éléments que vous n'autorisez pas, vous devez les ignorer gracieusement ou déclencher une condition d'erreur. Si le XML n'est pas bien formé, vous devez générer une erreur. Sinon, votre programme ne sera pas robuste face aux erreurs provenant de l'autre extrémité et pourrait présenter des failles de sécurité.

+0

Salut @Don Quixote, en général, j'ai tendance à être d'accord avec vous. Mais dans ce cas, je crois qu'ils fournissent du XML sémantiquement correct, mais pas nécessaire dans un format correct. Je pourrais soit nettoyer leur XMN dans mon code, que je planifie de faire, ou modifier ma classe C# pour gérer cela, ce qui fonctionnera, mais impliquer un peu plus de travail. Ou je pourrais leur demander de changer le XML afin qu'il soit plus facile pour nous et probablement pour d'autres développeurs de travailler avec leur API.Alors oui, j'ai un choix, et si je peux choisir, ce sera plus intelligent, plus dur. –

+0

Pour référence, voir ceci: http://stackoverflow.com/questions/774192/what-is-the-correct-way-to-represent-null-xml-elements pour voir pourquoi je pense que leur XML ne représente pas null élément dans un format correct. –

Questions connexes