使用.Net XMLReader读取xml时,由于该元素仅包含空格,因此对以下xml的XSD验证失败:
<Text> </Text>
这是XSD的相关部分:
<xs:simpleType name="MaxText">
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:maxLength value="25"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="Text" type="MaxText">
</xs:element>
这是生成的错误消息:
The 'Text' element is invalid - The value '' is invalid according to its datatype 'MaxText' - The actual length is less than the MinLength value.
执行以下代码行会引发验证错误:
var element = XNode.ReadFrom(XmlReader) as XElement;
这不会使验证失败,但是我不确定要解决此问题需要更改什么。
以下是重现该问题的控制台应用程序的代码:
using System;
using System.Text;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Linq;
using System.IO;
namespace XmlReader
{
class Program
{
static void Main(string[] args)
{
var xmlReaderSettings = SetXmlReaderSettings();
using(var memoryStream = GetXml())
{
using(var xmlReader = System.Xml.XmlReader.Create(memoryStream, xmlReaderSettings))
{
while (xmlReader.Read())
{
if (xmlReader.NodeType == XmlNodeType.Element)
{
if (xmlReader.LocalName.Equals("Text"))
{
var element = XNode.ReadFrom(xmlReader) as XElement;
Console.WriteLine(element);
}
}
}
}
}
Console.WriteLine("All elements parsed. Press any key to continue...");
Console.ReadLine();
}
private static XmlReaderSettings SetXmlReaderSettings()
{
var xmlReaderSettings = new XmlReaderSettings
{
ConformanceLevel = ConformanceLevel.Document,
DtdProcessing = DtdProcessing.Ignore,
CloseInput = true,
IgnoreWhitespace = true,
IgnoreComments = true,
IgnoreProcessingInstructions = true,
ValidationType = ValidationType.Schema,
Schemas = GetXmlSchemaSet()
};
xmlReaderSettings.ValidationEventHandler += OnValidationEventHandler;
return xmlReaderSettings;
}
private static XmlSchemaSet GetXmlSchemaSet()
{
var schemaCollection = new XmlSchemaSet();
var xsd = @"
<xs:schema id=""XMLSchema1""
targetNamespace=""http://tempuri.org/XMLSchema1.xsd""
elementFormDefault=""qualified""
xmlns=""http://tempuri.org/XMLSchema1.xsd""
xmlns:mstns=""http://tempuri.org/XMLSchema1.xsd""
xmlns:xs=""http://www.w3.org/2001/XMLSchema"">
<xs:element name=""Items"" />
<xs:simpleType name=""MaxText"">
<xs:restriction base=""xs:string"">
<xs:minLength value=""1"" />
<xs:maxLength value=""25"" />
</xs:restriction>
</xs:simpleType>
<xs:element name=""Text"" type=""MaxText"">
</xs:element>
</xs:schema>
";
var reader = new XmlTextReader(new StringReader(xsd));
schemaCollection.Add(XmlSchema.Read(reader, null));
schemaCollection.Compile();
return schemaCollection;
}
private static MemoryStream GetXml()
{
var xmlString = @"<?xml version=""1.0"" encoding=""utf-8""?>
<Items xmlns=""http://tempuri.org/XMLSchema1.xsd"">
<Text> </Text>
</Items>";
var byteArray = Encoding.ASCII.GetBytes(xmlString);
return new MemoryStream(byteArray);
}
private static void OnValidationEventHandler(object sender, ValidationEventArgs e)
{
Console.WriteLine($"ValidationError: {e.Message}");
}
}
}
答案 0 :(得分:0)
如果您不希望有此空间,请尝试将MaxLength设置为0
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="MaxText">
<xs:restriction base="xs:string">
<xs:minLength value="0"/>
<xs:maxLength value="25"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="Text" type="MaxText"/>
</xs:schema>
答案 1 :(得分:0)
设置IgnoreWhitespace = false解决了该问题。