XmlReader erhalten Element Standard von Schema
Frage
Dies ist wahrscheinlich eine naive Frage zu XmlReader
, aber ich habe eine Antwort in der MSDN-Dokumentation nicht aufgedreht.
Nehmen wir an, ich XSD SchemaTest.xsd
haben
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="pageSettings">
<xs:complexType>
<xs:sequence>
<xs:element name="width" type="xs:decimal" default="8.5" minOccurs="0"/>
<xs:element name="height" type="xs:decimal" default="11" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
wohlgeformte XML
Dokument SchemaTest.xml
dieses Schema entspricht,
<?xml version="1.0" encoding="utf-8" ?>
<pageSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="SchemaTest.xsd">
<width/>
<height>11</height>
</pageSettings>
, und dass ich versuche, dieses Dokument mit einem XmlReader
zu lesen wie folgt.
static void Main(string[] args) {
decimal width;
decimal height;
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreWhitespace = true;
settings.Schemas.Add(null, "C:\\Projects\\SchemaTest\\SchemaTest\\SchemaTest.xsd");
using (XmlReader reader = XmlReader.Create("C:\\Projects\\SchemaTest\\SchemaTest\\SchemaTest.xml", settings)) {
reader.ReadStartElement();
if (reader.Name == "width") {
width = reader.ReadElementContentAsDecimal("width", "");
// if fail, width = default from schema
}
if (reader.Name == "height") {
height = reader.ReadElementContentAsDecimal("height", "");
// if fail, height = default from schema
}
reader.ReadEndElement();
}
}
Zur Zeit erhalte ich eine System.FormatException
darauf hinweist, dass der Gehalt an dem Element width
ist im richtigen Format nicht. Es scheint, dass reader
versucht, den Inhalt in dem Element zu lesen und ist nicht im Schema spezifiziert auf den Standardwert in Verzug. Was ist der richtige Weg, dies zu umgehen?
Außerdem ist es mein Verständnis, dass für Elemente, nur das Schema eines Standardwert liefert, wenn ein Element mit leeren Inhalt erscheint aber, dass es bietet keinen Standardwert, wenn das Element fehlt. Bedeutet dies, dass es keine Möglichkeit gibt, einen Standardwert für optionale Elemente zu erhalten, die fehlt?
Lösung
Was mit leeren Elementen arbeiten, setzen settings.ValidationType = ValidationType.Schema
und Sie sollten den Standardwert erhalten wie gewünscht.
In Bezug auf fehlende Elemente sind diejenigen, die als, nun ja, fehlt ;-) und somit nicht über einen Standardwert. Theoretisch könnte man das Schema analysiert (zum Beispiel des Schemas Object Model), um den Standardwert zu erhalten. Aber das gegen den spec sein würde.
Haben Sie darüber nachgedacht, Attribute verwenden, wie <pageSettings height="55"/>
? In diesem Szenario sollten Sie die Standardwerte für fehlende Attribute erhalten.