2

这可能是一个关于 的幼稚问题XmlReader,但我还没有在 MSDN 文档中找到答案。

假设我有 XSDSchemaTest.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正在尝试读取元素中的内容,并且没有默认为架构中指定的默认值。处理这个问题的正确方法是什么?

此外,我的理解是,对于元素,模式仅在元素以空内容出现时提供默认值,但如果元素缺失,则不提供默认值。这是否意味着无法为缺少的可选元素获取默认值?

4

1 回答 1

3

至于使用空元素,设置settings.ValidationType = ValidationType.Schema并且您应该根据需要获得默认值。

关于缺失的元素,那些被认为是缺失的;-),因此没有默认值。理论上,您可以解析模式(例如,使用模式对象模型)以获得默认值。但这将违反规范。

您是否考虑过使用属性,例如<pageSettings height="55"/>?在这种情况下,您应该获得缺失属性的默认值。

于 2009-05-04T19:09:40.807 回答