Attribut XML de ne pas obtenir de préfixe d'espace de noms
J'ai besoin de générer le fichier XML suivant lors de la sérialisation:
(fragment)
<IncidentEvent a:EventTypeText="Beginning" xmlns:a="http://foo">
<EventDate>2013-12-18</EventDate>
<EventTime>00:15:28</EventTime>
</IncidentEvent>
La classe en question ressemble à ceci:
public class IncidentEvent
{
public string EventDate { get; set; }
public string EventTime { get; set; }
[XmlAttribute("EventTypeText", Namespace = "http://foo")]
public string EventTypeText { get; set; }
}
Il semble que le processus est à remarquer que l'espace de noms est déjà déclaré dans un xmlns: à la racine et est ignorant mon attribut. J'ai aussi essayé le suivant:
[XmlRoot(Namespace = "http://foo")]
public class IncidentEvent
{
public string EventDate { get; set; }
public string EventTime { get; set; }
private XmlSerializerNamespaces _Xmlns;
[XmlNamespaceDeclarations]
public XmlSerializerNamespaces Xmlns
{
get
{
if (_Xmlns == null)
{
_Xmlns = new XmlSerializerNamespaces();
_Xmlns.Add("ett", "http://foo");
}
return _Xmlns;
}
set
{
_Xmlns = value;
}
}
[XmlAttribute("EventTypeText", Namespace = "http://foo")]
public string EventTypeText { get; set; }
}
Cette résultats dans le fichier XML suivant:
<ett:IncidentEvent EventTypeText="Beginning" xmlns:ett="http://foo">
<ett:EventDate>2013-12-18</ett:EventDate>
<ett:EventTime>00:15:28</ett:EventTime>
</ett:IncidentEvent>
Qui n'est pas ce que je veux. L'élément ne doit pas être précédé, l'attribut doit être. Ce qui est nécessaire pour obtenir le sérialiseur pour comprendre ce que je veux?
Vous devez vous connecter pour publier un commentaire.
J'ai fait quelques recherches peuvent être réponse suivante permet de
Pour les Attributs préfixe d'espace de noms, vous devez spécifier un espace de noms différent de la balise autre que ce que vous avez spécifié
http://foo
. Code suivant espérons-le, permettra de résoudre votre problème. Dans le code j'ai supprimer l'espace de noms pour les éléments et a ajouté que pour l'attribut.http://www.w3.org/TR/2009/REC-xml-names-20091208/#defaulting
C'est peut être un bug dans
XmlSerializer
.Comme vous l'avez remarqué, même lorsque
XmlAttributeAttribute.Espace de noms
est définie de manière explicite, l'attribut ne sera pas précédé dans certaines situations. De tests, cela semble se produire lorsque l'attribut d'espace de noms se trouve être le même que l'espace de noms de l'élément en cours de rédaction.Par exemple:
Sérialise le code XML suivant:
Et depuis l'attribut est unprefixed, il n'est effectivement pas dans tout l'espace de noms, comme il est expliqué dans le XML standard: Le nom d'espace de noms pour un unprefixed nom de l'attribut de toujours n'a pas de valeur.
Toutefois, les éléments suivants:
Sérialise avec l'attribut correctement préfixé:
La solution de contournement est explicitement défini
[XmlAttribute(Forme = XmlSchemaForm.Qualifié)]
. Donc:Sérialise à
que nécessaire.
Espaces de noms sont destinés à faire la différence entre deux élément XML portant le même nom. Comme XML différents éléments peuvent avoir le même nom d'attribut, mais un sens différent. Donc, il n'y a aucun avantage d'avoir de l'espace de noms de balise pour un attribut XML attributs sont considérés comme faisant partie de "l'élément de l'espace de noms" seulement.
Dans votre exemple
EventTypeText
est une partie de l'espace de noms ett:IncidentEventVeuillez vous référer à http://www.w3.org/TR/REC-xml-names/ pour les espaces de noms XML
Je vais vous donner KKJ de crédit pour la réponse, mais j'ai découvert un autre scénario qui provoque encore des questions. Apparemment, si l'objet à sérialiser est un enfant d'un autre objet, si l'objet parent de l'espace de noms est la même que l'enfant, le processus suppose que vous n'avez pas besoin de déclarer explicitement l'espace de noms pour l'enfant.
Par la mise en œuvre de IXmlSerializable, je peux écrire manuellement les éléments et les attributs exactement de la manière dont j'ai besoin. Puisque c'est un one-way à l'exportation, je n'ai pas besoin de mettre en œuvre quelque chose, mais la méthode WriteXml.
Je ne suis toujours pas sûr si c'est le meilleur, mais il fonctionne pour le moment.