Question

C'est probablement une question naïve à propos de XmlReader, mais je n'ai pas trouvé de réponse dans la documentation MSDN.

Supposons que j'ai XSD SchemaTest.xsd

<?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>

document XML bien formé SchemaTest.xml conforme à ce schéma

<?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>

et que j'essaie de lire ce document avec un System.FormatException comme suit.

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();
    }
}

Actuellement, je reçois un width indiquant que le contenu de l'élément reader n'est pas au format correct. Il semble que <=> tente de lire le contenu de l’élément et n’a pas la valeur par défaut spécifiée dans le schéma. Quelle est la bonne façon de gérer cela?

De plus, je comprends que pour les éléments, le schéma ne fournit une valeur par défaut que si un élément apparaît avec un contenu vide, mais qu’il ne fournit pas de valeur par défaut si l’élément est manquant. Est-ce que cela implique qu’il n’ya aucun moyen d’obtenir une valeur par défaut pour les éléments optionnels manquants?

Était-ce utile?

La solution

Pour travailler avec des éléments vides, définissez settings.ValidationType = ValidationType.Schema et vous devriez obtenir la valeur par défaut, si vous le souhaitez.

En ce qui concerne les éléments manquants, ceux-ci sont considérés, ainsi, il manque ;-) et n'ont donc pas de valeur par défaut. Théoriquement, vous pouvez analyser le schéma (par exemple, à l'aide du modèle d'objet de schéma) pour obtenir la valeur par défaut. Mais ce serait contre la spécification.

Avez-vous envisagé d'utiliser des attributs, tels que <pageSettings height="55"/>? Dans ce scénario, vous devriez obtenir les valeurs par défaut des attributs manquants.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top