3

我正在使用带有附加 XSD 的 XmlReader 进行验证。

在读取和验证我的 XML 文档时,我想在我的 C# 代码中确定 XSD 中为特定元素指定的“maxLength”值。例如,我的 XSD 片段非常简单地定义为:

<xsd:element name="testing" minOccurs="0">
    <xsd:simpleType>
        <xsd:restriction base="xsd:string">
            <xsd:maxLength value="10"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:element>

我可以使用以下方法轻松获得“minOccurs”值:

myReader.SchemaInfo.SchemaElement.MinOccurs;

但是我如何获得'maxLength'值(上面的示例片段中的值为10)???

我认为 ' myReader.SchemaInfo.SchemaElement.Constraints' 可能会给我这个信息,但是那个集合的 'Count' 总是为零。

谢谢,

拍。

4

3 回答 3

4

你会在这里找到:Accessing XML Schema Information During Document Validation一个很好的解释如何做到这一点及更多。

于 2009-10-20T16:47:17.453 回答
1

使用 myReader.SchemaInfo 可以做到这一点(请参阅 najmeddine 的回复),但如果您需要访问未在 SchemaInfo 对象中公开的内容...

..XSD 是一种 XML 语言。您可以简单地加载 XSD 文件并使用 XPath 找到“测试”元素的定义及其 maxLength。

于 2009-10-20T16:46:51.407 回答
0

我今天遇到了问题,链接不再工作。

这是您需要的扩展方法

public static int GetXsdFieldMaxLength(this XmlReader reader)
{
    var schemaType = reader.SchemaInfo.SchemaType;
    if (schemaType is XmlSchemaSimpleType simpleType)
    {
        XmlSchemaSimpleTypeContent content = simpleType.Content;

        // see XmlSchemaSimpleTypeRestriction source code for list of all facet types
        if (content is XmlSchemaSimpleTypeRestriction restriction)
        {
            // XmlSchemaFacet facet
            foreach (XmlSchemaObject facet in restriction.Facets)
            {
                if (facet is XmlSchemaMaxLengthFacet ml)
                {
                    // the Value is a string, convert it to an int
                    return ml.Value.ToInt();
                }
            }
        }
    }

    return -1;
}

然后,您可以在 XML 验证代码中使用该函数,如下所示:

// var settings = new XmlReaderSettings();
settings.ValidationEventHandler += (object sender, ValidationEventArgs args) =>
{
    // the actual int MaxLength is missing in the Validation Error
    var reader = sender as XmlReader;
    var maxLength = reader.GetXsdFieldMaxLength();
}
于 2021-08-02T01:02:47.527 回答