这可能是关于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 2009-05-04 19:23:36