2009-05-04 2 views
1

Это, вероятно, наивный вопрос о XmlReader, но я не получил ответа в документах MSDN.XmlReader получить элемент по умолчанию от схемы

Предположим, что у меня есть 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> 

хорошо сформированный XML документ SchemaTest.xml в соответствии с этой схемой

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

и что я стараюсь читать этот документ с XmlReader следующим образом.

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

В настоящее время я получать System.FormatException указывая, что содержание элемента width не в правильном формате. Похоже, что reader пытается прочитать содержимое в элементе и не имеет значения по умолчанию, указанного в схеме. Каков правильный способ справиться с этим?

Кроме того, я понимаю, что для элементов схема содержит только значение по умолчанию, если элемент появляется с пустым содержимым, но он не предоставляет значение по умолчанию, если элемент отсутствует. Означает ли это, что нет способа получить значение по умолчанию для необязательных элементов, которые отсутствуют?

ответ

1

Что касается работы с пустыми элементами, установите settings.ValidationType = ValidationType.Schema, и вы должны получить значение по умолчанию по желанию.

Что касается отсутствующих элементов, то считается, что они отсутствуют ,-) и, следовательно, не имеют значения по умолчанию. Теоретически, вы можете разобрать схему (например, используя объектную модель схемы), чтобы получить значение по умолчанию. Но это было бы против спецификации.

Считаете ли вы использование атрибутов, например <pageSettings height="55"/>? В этом случае вы должны получить значения по умолчанию для отсутствующих атрибутов.

+0

settings.ValidationType = ValidationType.Schema сделал трюк. Спасибо. – jason

Смежные вопросы