2

これはおそらくについての素朴な質問です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>

そして、私はこの文書を次のように読み込もうとして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 に答える