题
这可能是关于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>
我尝试用System.FormatException
阅读本文档,如下所示。
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();
}
}
目前我收到width
表示元素reader
上的内容格式不正确。似乎<=>正在尝试读取元素中的内容,而不是默认为模式中指定的默认值。处理这个问题的正确方法是什么?
此外,我的理解是,对于元素,如果元素以空内容显示但是如果元素缺失则它不提供默认值,则模式仅提供默认值。这是否意味着无法获取缺少的可选元素的默认值?
解决方案
至于处理空元素,设置settings.ValidationType = ValidationType.Schema
,你应该得到所需的默认值。
关于缺失的元素,那些被认为是,缺失;-)因此没有缺省值。从理论上讲,您可以解析模式(例如,使用模式对象模型)来获取默认值。但这将违反规范。
您是否考虑过使用属性,例如<pageSettings height="55"/>
?在这种情况下,您应该获取缺少属性的默认值。
不隶属于 StackOverflow