XmlReader получает элемент по умолчанию из схемы - PullRequest
1 голос
/ 04 мая 2009

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

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

1 голос
/ 04 мая 2009

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

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

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

...