XML模式验证不会在尾随换行时失败

时间:2018-12-10 07:16:17

标签: c# .net xml xsd .net-core

我使用XmlReader对数据类型不允许换行的XML元素执行模式验证。如果该值在字符串的开头或结尾之前的任何位置包含换行符,则架构验证将按预期失败。如果该值在换行符之前以空格结尾,则它将失败架构。只有当换行符位于字符串的末尾时,架构验证才不会失败。我相信它应该会失败。

这是一个示例架构:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="StringContent" type="an" />
    <xs:simpleType name="an">
        <xs:restriction base="xs:string">
            <xs:pattern value="[ !-~]*"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema> 

这是示例代码:

var xmlSchemaSet = new XmlSchemaSet();
xmlSchemaSet.Add(XmlSchema.Read(new StringReader(schema),  
        (sender, args) => { Console.WriteLine(args.Exception.Message); }));

var xmlReaderSettings = new XmlReaderSettings
{
    ValidationType = ValidationType.Schema,
    Schemas = xmlSchemaSet
};

xmlReaderSettings.ValidationEventHandler += 
    delegate (object sender, ValidationEventArgs args)
         {
            Console.WriteLine($"{description}: {args.Exception.Message}"); 
         };

var xmlDateReader = XmlReader.Create(
    new StringReader("<StringContent>some string content\n</StringContent>"), xmlReaderSettings);

while (xmlDateReader.Read()) { } 

我们使用的实际模式是由标准机构管理的,因此,我无法对其进行更改。当尾随换行符时,有没有办法让XmlReader正确地使模式验证失败?

1 个答案:

答案 0 :(得分:0)

<xs:pattern value="[\w]+"/>

[\ w] +

匹配单个字符,即“单词字符”(Unicode;任何字母或表意文字,数字,连接器标点符号)«[\ w] +»    在一次和无限制的时间之间,尽可能地多次,根据需要(贪婪)“«+»

验证是基于模式进行的,如果您不拥有该模式并且无法更改它,那么请遵守其规则或与提供该模式的一方进行协商。

要仅匹配不包含LF的字符串,请使用:

[^ \ n] +