XmlReader получает элемент по умолчанию из схемы
Вопрос
Это, вероятно, наивный вопрос о 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"/>
? В этом случае вы должны получить значения по умолчанию для отсутствующих атрибутов.