2009-07-17 5 views
2

Ich habe vor kurzem die IXmlSerializable-Schnittstelle Informationen auf MSDN gelesen und war ein wenig verwirrt über die gesamte End-Tag-Sache.XmlSerialization - Lesen der Endelement-Tag?

Wie ich es verstehe, wenn Sie IXmlSerializable implementieren, dann müssen Sie nicht das Ende-Tag schreiben, aber Sie müssen es lesen? Z.B. Folgendes würde einen Fehler, wenn meine Klasse A nicht das Ende-Tag geschieht

<A> 
    <i>32</i> 
</A> 

Aber was liest, wenn der Inhalt

<A i="32"/> 

ist, wenn ich hier den End-Tag zu lesen versuchen, erhalte ich eine InvalidOperationException. Aber wenn ich weiter lese, um zu bestimmen, was ich lesen soll, ist das für die Leser nicht besonders wichtig?

Ich denke, ich bin nur ein wenig verloren, da der Code, mit dem ich arbeite, ein wenig komplexer wird, wenn ich mit IXmlSerializable Kinder (die von verschiedenen Typen sein können) und Sammlungen von IXmlSerializable Elemente beschäftigen .

+0

Ich war wo du bist. Dann wechselte ich zu Linq zu Xml. – Will

+0

Ich möchte Linq nicht verwenden danke. Teilweise, weil ich möchte, dass meine Bibliothek mit .NET 2.0 kompatibel ist, und teilweise weil ich Linq woanders vermieden habe, wo es aufgrund seiner langsameren Leistung offensichtlich gewesen wäre, es zu verwenden. – Ian

Antwort

1

Sowohl XmlReader als auch XPathNavigator implementieren eine Eigenschaft namens IsEmptyElement.

Aus der Dokumentation:

Wenn in einer abgeleiteten Klasse überschrieben, erhält einen Wert, der angibt, ob der aktuelle Knoten ein leeres Element ohne einen Tag-Endelements.

Also, wenn Sie sehen, ein Start-Element-Ereignis, wenn IsEmptyElement ist true Sie nicht für ein End-Element Ereignis aussehen sollten. Das Startelement-Ereignis fungiert für diesen Fall als Anfang und Ende.

+0

Ok danke für die Info. Ich glaube, ich habe missverstanden, was das IsEmptyElement bedeutet. Ich nahm an, dass Attribute auf einem Element bedeuteten, dass es nicht leer war, aber glaube, dass das falsch ist ... – Ian

+0

Diese Antwort ist hilfreich, danke. Ich habe die gleiche falsche Annahme gemacht wie Ian, ich denke, die Immobilie wird nicht intuitiv benannt. –

2

Ich erinnere mich an XmlReader.IsEmptyElement. Auf dem Start-Tag, wenn dies eingestellt ist, haben Sie <a />. Wenn es nicht eingestellt ist, haben Sie <a></a>. Letzteres liest das End-Tag, das erste nicht.

-1

Ich denke, das etwas über das Ende-Tag zu lesen für ein Szenario ist, wo Ihr Ziel in einer größeren Struktur eingebettet ist:

public class Wrapper { 
    public A Wrapped; 
} 

<Wrapper> 
    <Wrapped><i>32</i></Wrapped> 
</Wrapper> 

Ich erwarte, dass Sie <Wrapped> und </Wrapped> aber nicht </Wrapper> lesen müssen.

+0

Grund für den Downvote? –

+0

Ich vermute, jemand versucht, Ihren Kommentar falsch zu sagen ?? (Ich habe nicht abgestimmt). – Ian

+0

Es wäre gut zu wissen, wo ich falsch liege, also wiederhole ich es nicht. –