XML-Attribut-nicht immer-namespace-Präfix
Brauche ich um zu generieren, die während der folgenden XML-Serialisierung:
(fragment)
<IncidentEvent a:EventTypeText="Beginning" xmlns:a="http://foo">
<EventDate>2013-12-18</EventDate>
<EventTime>00:15:28</EventTime>
</IncidentEvent>
Der betreffenden Klasse sieht wie folgt aus:
public class IncidentEvent
{
public string EventDate { get; set; }
public string EventTime { get; set; }
[XmlAttribute("EventTypeText", Namespace = "http://foo")]
public string EventTypeText { get; set; }
}
Scheint es, dass der serializer ist zu bemerken, dass der namespace wird deklariert in einem xmlns: an der Wurzel und ignoriert mein Attribut. Ich habe auch versucht, die folgenden:
[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; }
}
Diese Ergebnisse in der folgenden XML-Code:
<ett:IncidentEvent EventTypeText="Beginning" xmlns:ett="http://foo">
<ett:EventDate>2013-12-18</ett:EventDate>
<ett:EventTime>00:15:28</ett:EventTime>
</ett:IncidentEvent>
Ist nicht das, was ich will. Das element sollte nicht vorangestellt werden, das Attribut sein sollte. Was erforderlich ist, um dem serializer zu verstehen, was ich will?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich einige der Forschung vielleicht folgende Antwort hilft
Für Attribute haben, namespace-Präfix spezifizieren Sie einen anderen namespace-tag anderes als das, was Sie angegeben haben
http://foo
. Folgenden code hoffentlich lösen Ihr Problem. In dem code, den ich habe entfernen Sie den namespace für die Elemente und fügte hinzu, nur für das Attribut.http://www.w3.org/TR/2009/REC-xml-names-20091208/#defaulting
Dies möglicherweise ein Fehler in
XmlSerializer
.Wie Sie sicher bemerkt haben, auch wenn
XmlAttributeAttribute.- Namespace
explizit festgelegt ist, wird das Attribut nicht als Präfix in bestimmten Situationen. Aus den Tests, dies scheint zu passieren, wenn das Attribut namespace passiert der gleiche sein wie der Namensraum des Elements, die derzeit geschrieben.Zum Beispiel:
Serialisiert, um die folgenden XML-Code:
Und da das Attribut unprefixed, es ist eigentlich nicht in jedem Namensraum, wie bereits erläutert in der XML-standard: Der namespace-name für eine unprefixed Attribut name hat immer keinen Wert.
Jedoch die folgenden:
Serialisiert mit dem Attribut korrekt vorangestellt:
Die Problemumgehung ist explizit
[XmlAttribute(Form = XmlSchemaForm.Qualifizierten)]
. Also:Serialisiert zu
als erforderlich.
Namespaces sind dazu gedacht, zu unterscheiden zwischen zwei XML-Elemente mit demselben Namen. Wie verschiedene XML-Elemente haben gleiche Attribut-Namen, aber unterschiedliche Bedeutung. So ist es kein Vorteil, dass Sie namespace-tag für ein Attribut als XML-Attribute werden als Teil von "element namespace" nur.
In deinem Beispiel
EventTypeText
ist Teil des namespace ett:IncidentEventBitte http://www.w3.org/TR/REC-xml-names/ für XML-Namespaces
Ich gebe KKD Kredit für die Antwort, ich entdeckte aber ein anderes Szenario, das verursacht noch immer Probleme. Offenbar, wenn das Objekt serialisiert wird ein Kind von einem anderen Objekt, wenn das parent-Objekt das namespace ist der gleiche wie der des Kindes, der serializer wird vorausgesetzt, Sie müssen nicht explizit deklariert den Namensraum für das Kind.
Durch die Implementierung von IXmlSerializable kann ich manuell schreiben, die die Elemente und Attribute in genau der Weise, die ich brauche. Da dies ein one-way-export, brauchte ich nicht zu implementieren, was aber die WriteXml-Methode.
Bin ich mir noch nicht sicher, ob dies die besten Weg, aber es funktioniert für den moment.