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