Ceci est probablement une question naïve sur XmlReader
, mais je n'ai pas trouvé de réponse dans les documents MSDN.XmlReader obtenir l'élément par défaut du schéma
Supposons que je 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>
bien formé XML
Document 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 XmlReader
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 System.FormatException
indiquant que le contenu de l'élément width
n'est pas dans le bon format. Il semble que reader
essaie de lire le contenu de l'élément et ne soit pas défini par défaut sur la valeur par défaut spécifiée dans le schéma. Quelle est la bonne façon de gérer cela? En outre, je crois comprendre que pour les éléments, le schéma fournit uniquement une valeur par défaut 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. Cela implique-t-il qu'il n'existe aucun moyen d'obtenir une valeur par défaut pour les éléments facultatifs manquants?
settings.ValidationType = ValidationType.Schema a fait l'affaire. Je vous remercie. – jason