2009-05-04 18 views
1

这可能是关于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正在尝试读取元素中的内容,而不是默认为模式中指定的默认值。处理这个问题的正确方法是什么?

此外,我的理解是,对于元素,如果元素显示为空内容,则架构仅提供默认值,但如果元素缺失,则该元素不提供默认值。这是否意味着没有办法为缺失的可选元素获取默认值?

回答

1

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

关于丢失的元素,这些都被认为是错过了;-),因此没有默认值。理论上,您可以解析模式(例如使用模式对象模型)来获取默认值。但是这将违背规范。

你有没有考虑使用属性,如<pageSettings height="55"/>?在这种情况下,您应该获取缺少属性的默认值。

+0

settings.ValidationType = ValidationType.Schema取得了诀窍。谢谢。 – jason 2009-05-04 19:23:36