我正在使用 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>
我的代码执行以下操作:
XmlSchema
。SchemaSet
,然后进行编译。XmlReader
(XsdValidatingReader
): var xmlReaderSettings = new XmlReaderSettings
{
CheckCharacters = true,
DtdProcessing = DtdProcessing.Prohibit,
Schemas = xmlSchemaSet,
ValidationType = ValidationType.Schema,
};
XmlDocument.Load(xmlReader)
。文档对象产生:
<?xml version="1.0"?>
<pre:root xmlns:pre="http://example.org/scratch"> abc </pre:root>
特别是,XmlDocument.DocumentElement 具有:
您面临着 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>