.NET 8.0 未标准化 xs:token 元素的空白?

问题描述 投票:0回答:1

我正在使用 C# 和 .NET 8.0.6。

我有一个 XSD,它声明了一个带有

xs:token
内容的“根”元素。 当我使用具有填充内容的实例元素验证文档时,填充会被保留吗? 我期望删除填充(前导和尾随空格)。

XSD 是:

<?xml version='1.0'?>

<xs:schema
    targetNamespace = "http://example.org/scratch"
    xmlns           = "http://example.org/scratch"
    xmlns:xs        = "http://www.w3.org/2001/XMLSchema">

<xs:element name="root" type="xs:token"/>

</xs:schema>

实例是:

<?xml version='1.0'?>

<pre:root xmlns:pre="http://example.org/scratch">   abc   </pre:root>

我的代码执行以下操作:

  1. 将 XSD 读取为 System.Xml.Schema。
    XmlSchema
  2. 将架构添加到 System.Xml.Schema。
    SchemaSet
    ,然后进行编译。
  3. 使用以下方法创建
    XmlReader
    (
    XsdValidatingReader
    ):
    var xmlReaderSettings = new XmlReaderSettings
    {
        CheckCharacters = true,
        DtdProcessing   = DtdProcessing.Prohibit,
        Schemas         = xmlSchemaSet,
        ValidationType  = ValidationType.Schema,
    };
  1. 使用 System.Xml 加载实例。
    XmlDocument.Load(xmlReader)

文档对象产生:

<?xml version="1.0"?>
<pre:root xmlns:pre="http://example.org/scratch">   abc   </pre:root>

特别是,XmlDocument.DocumentElement 具有:

  • InnerXml:“   abc   ”
  • 命名空间URI:“http://example.org/scratch”
  • SchemaInfo.SchemaType.TypeCode:“令牌”
c# .net xml xsd xsd-validation
1个回答
0
投票

您面临着 XSD 验证的特殊细微差别。

首先,它将

xs:token
数据类型应用于元素值,折叠空格,然后运行验证。

如果您需要强制将空格视为无效,请尝试以下 XSD。

XSD

<?xml version="1.0"?>
<xs:schema targetNamespace="http://example.org/scratch"
           xmlns="http://example.org/scratch"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="root">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:pattern value="[^\s]+"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
</xs:schema>
© www.soinside.com 2019 - 2024. All rights reserved.