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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top