XmlReader récupère les éléments par défaut du schéma
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?
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.