Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XSD验证未通过尾随换行符_C#_Xml_Xsd - Fatal编程技术网

C# XSD验证未通过尾随换行符

C# XSD验证未通过尾随换行符,c#,xml,xsd,C#,Xml,Xsd,Xml验证不是我要碰的东西,除非我必须碰,所以我可能遗漏了一些愚蠢的东西,到目前为止,我在谷歌上找不到任何帮助。我的问题是我有一个限制,说它只能是字母或空格的类型。带有前导换行符的元素验证失败,但尾随换行符通过。如何使尾随换行符失败 我创建了一个精简的测试用例,如下所示: 验证代码: public List<XsdValidationError> ValidateXmlAgainstXsd(String xml, String xsdFilePath, Boolean process

Xml验证不是我要碰的东西,除非我必须碰,所以我可能遗漏了一些愚蠢的东西,到目前为止,我在谷歌上找不到任何帮助。我的问题是我有一个限制,说它只能是字母或空格的类型。带有前导换行符的元素验证失败,但尾随换行符通过。如何使尾随换行符失败

我创建了一个精简的测试用例,如下所示:

验证代码:

public List<XsdValidationError> ValidateXmlAgainstXsd(String xml, String xsdFilePath, Boolean processSchemaLocation = false)
{
    var ret = new List<XsdValidationError>();
    var xss = new XmlSchemaSet();

    var xmlUrlResolver = new XmlUrlResolver();
    xmlUrlResolver.CachePolicy = new RequestCachePolicy(RequestCacheLevel.Default);
    xss.XmlResolver = xmlUrlResolver;

    var xsdXElement = XElement.Parse(File.ReadAllText(xsdFilePath));

    var targetNamespaceAttribute = xsdXElement.Attribute("targetNamespace");
    xss.Add(targetNamespaceAttribute != null ? targetNamespaceAttribute.Value : "", xsdFilePath);


    var settings = new XmlReaderSettings();
    settings.ValidationType = ValidationType.Schema;
    settings.Schemas = xss;
    settings.ValidationFlags = XmlSchemaValidationFlags.ProcessInlineSchema;

    if (processSchemaLocation)
        settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
    settings.ValidationEventHandler += (sender, e) =>
        {
            var xve = new XsdValidationError { Message = e.Message, LineNumber = e.Exception.LineNumber, LinePosition = e.Exception.LinePosition };

            ret.Add(xve);
        };

    using (var sr = new StringReader(xml))
    {
        var xr = XmlReader.Create(sr, settings);

        while (xr.Read());

        return ret;
    }
}

public class XsdValidationError
{
    public String Message { get; set; }
    public int LineNumber { get; set; }
    public int LinePosition { get; set; }

    public override string ToString()
    {
        return String.Format("Line {0:n0}, Position {1:n0}: {2}", this.LineNumber, this.LinePosition, this.Message);
    }
}
公共列表ValidateXmlAgainstXsd(字符串xml,字符串xsdFilePath,布尔processSchemaLocation=false) { var ret=新列表(); var xss=newxmlschemaset(); var xmlUrlResolver=新的xmlUrlResolver(); xmlUrlResolver.CachePolicy=新的RequestCachePolicy(RequestCacheLevel.Default); xss.XmlResolver=xmlUrlResolver; var xsdXElement=XElement.Parse(File.ReadAllText(xsdFilePath)); var targetNamespaceAttribute=xsdXElement.Attribute(“targetNamespace”); Add(targetNamespaceAttribute!=null?targetNamespaceAttribute.Value:,xsdFilePath); var设置=新的XmlReaderSettings(); settings.ValidationType=ValidationType.Schema; settings.Schemas=xss; settings.ValidationFlags=XmlSchemaValidationFlags.ProcessInlineSchema; if(processSchemaLocation) settings.ValidationFlags |=XmlSchemaValidationFlags.ProcessSchemaLocation; settings.ValidationEventHandler+=(发件人,e)=> { var xve=new XsdValidationError{Message=e.Message,LineNumber=e.Exception.LineNumber,LinePosition=e.Exception.LinePosition}; 重新添加(xve); }; 使用(var sr=newstringreader(xml)) { var xr=XmlReader.Create(sr,设置); 而(xr.Read()); 返回ret; } } 公共类XsdValidationError { 公共字符串消息{get;set;} 公共整数行号{get;set;} public int LinePosition{get;set;} 公共重写字符串ToString() { 返回String.Format(“行{0:n0},位置{1:n0}:{2}”),this.LineNumber,this.LinePosition,this.Message); } } 输入XML和XSD:

<People>
    <Person>Hello Person One
</Person>
    <Person>Hello Person Two</Person>
    <Person>
Hello Person Three</Person>
</People>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="People">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Person" maxOccurs="unbounded">
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:pattern value="[a-zA-Z ]+"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

你好,一号人物
你好,二号人物
你好,三号人物
在XML中,person one不会失败,person two应该通过,person two应该通过,person two应该通过。我需要一个人也失败


我无法更改输入XML或XSD。Visual Studio正确验证该文件。有什么想法吗?

我认为这是微软XSD解析器的一个怪癖/缺陷。xs:string类型的定义为:-

 <xsd:simpleType name="string" id="string">
   <xsd:restriction base="xsd:anySimpleType">
   <xsd:whiteSpace value="preserve"/>
   </xsd:restriction>
 </xsd:simpleType>

由于空白方面被设置为“保留”,它应该包含元素中的所有内容,包括空白和all

但是,正如您所注意到的,它忽略了尾随的空格。似乎除了在代码中手动应用验证规则之外,您对此无能为力


顺便说一句,它在Xerces中按预期进行验证(前导和尾随空格都有错误)。

我发现,如果切换到使用XmlDocument加载xml,它随后会正确验证,但我丢失了行号信息。我不确定引擎盖下到底发生了什么,但改变这一点将正确验证我的情况

var xd = new XmlDocument();
xd.LoadXml(xml);
var xr = XmlReader.Create(new XmlNodeReader(xd), settings);

我怀疑这是一个这样的错误,只是因为我在谷歌上找不到其他类似的问题。我想我不会是第一个遇到这个问题的人。但是,Xerces给了我一些其他的尝试,所以谢谢你!