C# XSD模式验证似乎忽略了必需的属性

C# XSD模式验证似乎忽略了必需的属性,c#,xml,C#,Xml,我正在使用XmlReader根据XSD模式文件验证我的XmlFile,但有一个例外:它没有报告缺少的必需属性 但是,它会报告不符合XSD的属性(名称拼写错误,不允许的内容) 例如,这两个属性都将在没有警告的情况下进行验证,即使这两个属性都是必需的: <Margin Units="IN"> <Margin Units="IN" Center="true"> 这是我的XSD: <?xml version="1.0" encoding="UTF-8"?>

我正在使用XmlReader根据XSD模式文件验证我的XmlFile,但有一个例外:它没有报告缺少的必需属性

但是,它会报告不符合XSD的属性(名称拼写错误,不允许的内容)

例如,这两个属性都将在没有警告的情况下进行验证,即使这两个属性都是必需的:

<Margin Units="IN">
<Margin Units="IN" Center="true">
这是我的XSD:

    <?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="SampleSchema">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Margins" minOccurs="0"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="Margins">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Header" minOccurs="0"/>
                <xs:element ref="Footer" minOccurs="0"/>
                <xs:element ref="LeftSide" minOccurs="0"/>
                <xs:element ref="RightSide" minOccurs="0"/>
            </xs:sequence>
            <xs:attribute ref="Units" use="required"/>
            <xs:attribute ref="CenterHorizontal" use="required"/>
            <xs:attribute ref="CenterVertical" use="required"/>
            <xs:attribute ref="PriorityHorizontal" use="required"/>
            <xs:attribute ref="PriorityVertical" use="required"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="Header">
        <xs:simpleType>
            <xs:restriction base="xs:decimal">
                <xs:minInclusive value="0"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="Footer">
        <xs:simpleType>
            <xs:restriction base="xs:decimal">
                <xs:minInclusive value="0"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="LeftSide">
        <xs:simpleType>
            <xs:restriction base="xs:decimal">
                <xs:minInclusive value="0"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="RightSide">
        <xs:simpleType>
            <xs:restriction base="xs:decimal">
                <xs:minInclusive value="0"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:attribute name="Units" default="PT">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value="IN"/>
                <xs:enumeration value="MM"/>
                <xs:enumeration value="PT"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="CenterHorizontal" type="xs:boolean" default="true">
    </xs:attribute>
    <xs:attribute name="CenterVertical" type="xs:boolean" default="true">
    </xs:attribute>
    <xs:attribute name="PriorityHorizontal" default="Left">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value="Left"/>
                <xs:enumeration value="Right"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="PriorityVertical" default="Header">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value="Header"/>
                <xs:enumeration value="Footer"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:attribute>
</xs:schema>

以下是我的XML:

<?xml version="1.0" encoding="UTF-8"?>
<SampleSchema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="sample.xsd">
    <Margins Units="PT" CenterHorizontal="false" CenterVertical="false" PriorityVertical="Header">
        <Header>36</Header>
        <Footer>36</Footer>
        <LeftSide>36</LeftSide>
        <RightSide>36</RightSide>
    </Margins>
</SampleSchema>

36
36
36
36
一旦初始验证成功,我是否必须编写代码来显式检查XML文件中的属性

或者有没有办法让XmlReader验证抛出这些警告?

尝试删除属性定义中的“默认值”:

…如果该属性实际上不在实例文档中,则架构的处理程序应使用默认值指定该属性


看来这就是为什么“必需”验证不起作用的原因。

您可以附加您的xsd和示例xml,它们应该失败,但不会失败吗?@Evk-好的,我已经添加了我的xsd和xml示例。您真的需要为必需的属性设置默认值吗?你试过删除默认值吗?@ViacheslavIvanov-如果默认值是我的问题的原因,我可以删除它们problem@ViacheslavIvanov-明白了!删除属性的默认值解决了问题。现在将报告缺少的属性。谢谢你指出这一点。如果你让你评论一个答案,我很乐意选择它。
    <?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="SampleSchema">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Margins" minOccurs="0"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="Margins">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Header" minOccurs="0"/>
                <xs:element ref="Footer" minOccurs="0"/>
                <xs:element ref="LeftSide" minOccurs="0"/>
                <xs:element ref="RightSide" minOccurs="0"/>
            </xs:sequence>
            <xs:attribute ref="Units" use="required"/>
            <xs:attribute ref="CenterHorizontal" use="required"/>
            <xs:attribute ref="CenterVertical" use="required"/>
            <xs:attribute ref="PriorityHorizontal" use="required"/>
            <xs:attribute ref="PriorityVertical" use="required"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="Header">
        <xs:simpleType>
            <xs:restriction base="xs:decimal">
                <xs:minInclusive value="0"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="Footer">
        <xs:simpleType>
            <xs:restriction base="xs:decimal">
                <xs:minInclusive value="0"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="LeftSide">
        <xs:simpleType>
            <xs:restriction base="xs:decimal">
                <xs:minInclusive value="0"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:element name="RightSide">
        <xs:simpleType>
            <xs:restriction base="xs:decimal">
                <xs:minInclusive value="0"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
    <xs:attribute name="Units" default="PT">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value="IN"/>
                <xs:enumeration value="MM"/>
                <xs:enumeration value="PT"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="CenterHorizontal" type="xs:boolean" default="true">
    </xs:attribute>
    <xs:attribute name="CenterVertical" type="xs:boolean" default="true">
    </xs:attribute>
    <xs:attribute name="PriorityHorizontal" default="Left">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value="Left"/>
                <xs:enumeration value="Right"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="PriorityVertical" default="Header">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value="Header"/>
                <xs:enumeration value="Footer"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:attribute>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<SampleSchema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="sample.xsd">
    <Margins Units="PT" CenterHorizontal="false" CenterVertical="false" PriorityVertical="Header">
        <Header>36</Header>
        <Footer>36</Footer>
        <LeftSide>36</LeftSide>
        <RightSide>36</RightSide>
    </Margins>
</SampleSchema>