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