XmlReader получает элемент по умолчанию из схемы

StackOverflow https://stackoverflow.com/questions/821188

  •  03-07-2019
  •  | 
  •  

Вопрос

Это, вероятно, наивный вопрос о 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>

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

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

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

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

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top