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