2010-07-27 8 views
3

je tente de lire un fichier XML qui contient l'élément suivant:XmlSerializer lance InvalidOperationException en ayant un préfixe d'espace de noms dans l'attribut

<ho:CODED-TYPE ho:BASE-DATA-TYPE="A_UINT16" CATEGORY="STANDARD-LENGTH-TYPE" ENCODING="UNSIGNED"> 

Ma classe pour décrire ce nœud ressemble que:

public ref class FIBEXCodedType 
{ 
public: 
    [XmlAttribute("ho:BASE-DATA-TYPE")] 
    property String^ BaseDataType; 

    [XmlAttribute("CATEGORY")] 
    property String^ Category; 

    [XmlAttribute("ENCODING")] 
    property String^ Encoding; 

    FIBEXCodedType(void); 
}; 

Je reçois un InvalidOperationException de XmlSerializer.ctor en me disant:

"Ungültiges Namenszeichen dans 'ho: BASE-DATA-TYPE'." (ceci pourrait être traduit par "caractère invalide dans: 'ho: BASE-DATA-TYPE'").

J'ai essayé également les éléments suivants:

[XmlAttribute("BASE-DATA-TYPE", Namespace="http://www.asam.net/xml")] 
property String^ BaseDataType; 

Mais cela ne fonctionne pas non plus. Cette fois-ci sans le message d'erreur mais le test unitaire échoue en me disant que la propriété est toujours définie sur "null".

Je suis complètement coincé avec ça. Ainsi, toute aide est appréciée

merci à l'avance

EDIT: un peu plus XML

<?xml version="1.0" ?> 
<fx:FIBEX xmlns:fx="http://www.asam.net/xml/fbx" xmlns:ho="http://www.asam.net/xml" xmlns:can="http://www.asam.net/xml/fbx/can" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="fibex4can.xsd" VERSION="3.1.0"> 

<fx:CODING ID="codingSpeed"> 
    <ho:SHORT-NAME>CodingSpeed</ho:SHORT-NAME> 
    <ho:DESC>Coding for speed values within this system.</ho:DESC> 
    <ho:CODED-TYPE ho:BASE-DATA-TYPE="A_UINT16" CATEGORY="STANDARD-LENGTH-TYPE" ENCODING="UNSIGNED"> 
    <ho:BIT-LENGTH>16</ho:BIT-LENGTH> 
    </ho:CODED-TYPE> 
</fx:CODING> 
+0

Vous pariez sur des chevaux différents à la fois: http://social.msdn.microsoft.com/Forums/en/asmxandxml/thread/b07be6c7-6a86 -4a2f-be72-64972ff0b1ff ;-) – Abel

+0

Ouais je sais :-(Difficile d'obtenir une réponse là-bas et ma barre de test de l'unité est toujours rouge, donc je suis effrayé hors de mon esprit :-( – yas4891

Répondre

2

réécrite réponse entière après modification par OP

Ma compréhension originale de l'erreur était erronée. L'erreur est levée sur l'initialisation du sérialiseur, pas lorsque vous lisez votre XML. Vous ne pouvez pas utiliser un deux-points : dans un nom. Si vous spécifiez un espace de noms, ne spécifiez pas le préfixe. En fait, vous ne spécifiez pratiquement jamais le préfixe (qui est juste un espace réservé pour l'espace de noms). Après cela, vous avez déjà remarqué que la valeur est null. La raison en est que le sérialiseur utilise par défaut des attributs non qualifiés. Si vous avez des attributs qualifiés, il suppose que l'espace de noms d'attribut est différent de l'espace de nom de l'élément. Cela fonctionnera:

<!-- this works (if namespaces are indeed different --> 
<ho:CODED-TYPE fx:BASE=DATA-TYPE="A_UINT16"...> 

<!-- this works, unqualified name takes namespace of parent element --> 
<ho:CODED-TYPE BASE=DATA-TYPE="A_UINT16"...> 

<!-- this fails, because XmlSerializer does not expect qualified attributes --> 
<ho:CODED-TYPE ho:BASE=DATA-TYPE="A_UINT16"...> 

Ceci semble un bogue bizarre. Voici somewhat similar report on this n chez MSDN, qui m'a aidé à la solution. Marquez simplement l'attribut comme qualifié. Les travaux suivants avec votre XML d'entrée (note XmlSchemaForm.Qualified):

[XmlRoot(ElementName = "FIBEX", Namespace = "http://www.asam.net/xml/fbx")] 
public class FIBEX 
{ 
    [XmlElement("CODING", Namespace = "http://www.asam.net/xml/fbx")] 
    public FIBEXCoding Coding { get; set; } 
} 

public class FIBEXCoding 
{ 
    [XmlElement("SHORT-NAME", Namespace = "http://www.asam.net/xml")] 
    public string ShortName { get; set; } 

    [XmlElement("DESC", Namespace = "http://www.asam.net/xml")] 
    public string ShortDescription { get; set; } 

    [XmlElement("CODED-TYPE", Namespace = "http://www.asam.net/xml")] 
    public FIBEXCodedType Codedtype { get; set; } 
} 

public class FIBEXCodedType 
{ 

    [XmlAttribute("BASE-DATA-TYPE", 
     Namespace = "http://www.asam.net/xml", 
     Form=XmlSchemaForm.Qualified)] 
    public string BaseDataType { get; set; } 

    [XmlAttribute("CATEGORY")] 
    public string Category { get; set; } 

    [XmlAttribute("ENCODING")] 
    public string Encoding { get; set; } 

    [XmlElement("BIT-LENGTH", Namespace = "http://www.asam.net/xml")] 
    public int BitLength { get; set; } 
} 
+0

Wooohaaa. ce poste :-( attendez une seconde s'il vous plaît – yas4891

+0

@ yas4891: s'il vous plaît montrer la déclaration exacte de votre XML d'entrée, y compris la façon dont les espaces de noms sont déclarés.En outre, montrer un échantillon minimisé d'entrée qui vous échoue.Utilisez-vous un schéma validateur ou est une DTD impliquée? – Abel

+0

Y Vous voulez vraiment que je publie l'intégralité de XmlSource? C'est à peu près 7KB. Que diriez-vous de nous mettre d'accord sur l'élément racine + l'élément parent de l'élément en question? Ma sérialisation fonctionne jusqu'à présent pour le reste du document, mais pas pour cet attribut dans le "faux" espace de noms. J'ai réussi à obtenir un autre attribut ("xml: lang") fonctionnant comme décrit ci-dessus, mais cela ne fonctionne pas ici. – yas4891