Сбой проверки Xml Xsd (xs:anyType)
У меня есть этот файл XML
<bookstore>
<test>
<test2/>
</test>
</bookstore>
и эта схема XSD
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="bookstore" type="bookstoreType"/>
<xsd:complexType name="bookstoreType">
<xsd:sequence maxOccurs="unbounded">
<xsd:element name="test" type="xsd:anyType" />
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
Я намерен проверить XML-файл из кода C#. Есть метод, который проверяет XML-файл:
// validate xml
private void ValidateXml()
{
_isValid = true;
// Get namespace from xml file
var defaultNamespace = XDocument.Load(XmlFileName).Root.GetDefaultNamespace().NamespaceName;
// Set the validation settings.
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
settings.Schemas.Add(defaultNamespace, XsdFileName);
settings.ValidationEventHandler += OnValidationEventHandler;
// Create the XmlReader object.
using(XmlReader reader = XmlReader.Create(XmlFileName, settings))
{
// Parse the file.
while (reader.Read()) ;
}
}
private void OnValidationEventHandler(object s, ValidationEventArgs e)
{
if (_isValid) _isValid = false;
if (e.Severity == XmlSeverityType.Warning)
MessageBox.Show("Warning: " + e.Message);
else
MessageBox.Show("Validation Error: " + e.Message);
}
Я знаю, этот файл XML действителен. Но мой код возвращает эту ошибку:
Validation Error: Could not find schema information for the element 'test2'
Где моя ошибка?
Спасибо!!!
1 ответ
ОБНОВЛЕНИЕ: я предполагаю, что ваш код соответствует указанной вами ошибке (я пробовал ваш код в.NET 3.5SP1 и не смог воспроизвести ваше поведение). Обходной путь ниже должен работать наверняка (ошибка, которую вы получаете, соответствует предложению о содержании процесса strict
в отличие от lax
).
замещать <xsd:element name="test" type="xsd:anyType" />
со сложным содержимым, которое допускает xsd:any, например:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="bookstore" type="bookstoreType"/>
<xsd:complexType name="bookstoreType">
<xsd:sequence maxOccurs="unbounded">
<xsd:element name="test">
<xsd:complexType>
<xsd:sequence>
<xsd:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
Наличие "слабого" все еще приведет к сообщению; Вы можете использовать "пропустить", если хотите, чтобы это сообщение исчезло. Несмотря на, skip
а также lax
в XSD: любой дает вам то, что вам нужно.