XmlReaderはスキーマから要素のデフォルトを取得します
質問
これはおそらく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