2009-05-04 7 views
1

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?

Répondre

1

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

En ce qui concerne les éléments manquants, ceux-ci sont considérés, bien, manquant ;-) et n'ont donc pas de valeur par défaut. Théoriquement, vous pouvez analyser le schéma (par exemple, en utilisant le 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, comme <pageSettings height="55"/>? Dans ce scénario, vous devriez obtenir les valeurs par défaut pour les attributs manquants.

+0

settings.ValidationType = ValidationType.Schema a fait l'affaire. Je vous remercie. – jason

Questions connexes