Вопрос по xml, validation, c# – Почему моя проверка XML не соответствует его схеме?

5

Мне нужно проверить файл XML по схеме. Файл XML генерируется в коде, и прежде чем сохранить его, мне нужно проверить его на правильность.

Я разобрал проблему до ее основных элементов, но у меня возникла проблема.

XML:

<code><?xml version="1.0" encoding="utf-16"?>
<MRIDSupportingData xmlns="urn:GenericLabData">
  <MRIDNumber>MRIDDemo</MRIDNumber>
  <CrewMemberIdentifier>1234</CrewMemberIdentifier>
  <PrescribedTestDate>1/1/2005</PrescribedTestDate>
</MRIDSupportingData>
</code>

Схема:

<code><?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns="urn:GenericLabData" targetNamespace="urn:GenericLabData" 
   xmlns:xs="http://www.w3.org/2001/XMLSchema">

   <xs:element name="MRIDSupportingData">
   <xs:complexType> 
      <xs:sequence>
        <xs:element name="MRIDNumber" type="xs:string" /> 
        <xs:element minOccurs="1" name="CrewMemberIdentifier" type="xs:string" />
      </xs:sequence>
   </xs:complexType>
  </xs:element>
</xs:schema>  
</code>

ValidationCode: (Этот код взят из простого приложения, которое я написал для проверки логики проверки. Файлы XML и XSD хранятся на диске и читаются оттуда. В реальном приложении файл XML будет находиться в памяти уже как XmlDocument объект и XSD будут считываться с внутреннего веб-сервера.)

<code>private void Validate()
{
  XmlReaderSettings settings = new XmlReaderSettings();
  settings.ValidationType = ValidationType.Schema;
  //settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
  //settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
  //settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
  settings.ValidationEventHandler += new ValidationEventHandler(OnValidate);

  XmlSchemaSet schemas = new XmlSchemaSet();
  settings.Schemas = schemas;
  try
  {
    schemas.Add(null, schemaPathTextBox.Text);
    using (XmlReader reader = XmlReader.Create(xmlDocumentPathTextBox.Text, settings))
    {
      validateText.AppendLine("Validating...");
      while (reader.Read()) ;
      validateText.AppendLine("Finished Validating");
      textBox1.Text = validateText.ToString();
    }
  }
  catch (Exception ex)
  {
    textBox1.Text = ex.ToString();
  }

}

StringBuilder validateText = new StringBuilder();
private void OnValidate(object sender, ValidationEventArgs e)
{
  switch (e.Severity)
  {
    case XmlSeverityType.Error:
      validateText.AppendLine(string.Format("Error: {0}", e.Message));
      break;
    case XmlSeverityType.Warning:
      validateText.AppendLine(string.Format("Warning {0}", e.Message));
      break;
  }
}
</code>

При выполнении вышеуказанного кода с файлами XML и XSD, определенными выше, я получаю такой вывод:

Validating... Error: The element 'MRIDSupportingData' in namespace 'urn:GenericLabData' has invalid child element 'MRIDNumber' in namespace 'urn:GenericLabData'. List of possible elements expected: 'MRIDNumber'. Finished Validating

Что мне не хватает? Насколько я могу судить, MRIDNumber - это MRIDNumber, так почему же ошибка?

Фактический XML-файл намного больше, чем XSD, но в самом начале он терпит неудачу, поэтому я почти свел проблему к нулю.

Любая помощь в этом была бы отличной.

Спасибо,
Кит

Кстати, эти файлы работают:

XML:

<code><?xml version='1.0'?>
<bookstore xmlns="urn:bookstore-schema">
  <book genre="novel">
    <title>The Confidence Man</title>
    <author>
      <first-name>Herman</first-name>
      <last-name>Melville</last-name>
    </author>
    <price>11.99</price>
  </book>
</bookstore>
</code>

Схема:

<code>  <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns="urn:bookstore-schema"
    elementFormDefault="qualified"
    targetNamespace="urn:bookstore-schema">
  <xsd:element name="bookstore">
    <xsd:complexType>
      <xsd:sequence >
        <xsd:element name="book"  maxOccurs="unbounded">
          <xsd:complexType>
            <xsd:sequence >
              <xsd:element name="title" type="xsd:string"/>
              <xsd:element name="author">
                <xsd:complexType>
                  <xsd:sequence >
                    <xsd:element name="first-name"  type="xsd:string"/>
                    <xsd:element name="last-name" type="xsd:string"/>
                  </xsd:sequence> 
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="price"  type="xsd:decimal"/>
            </xsd:sequence> 
            <xsd:attribute name="genre" type="xsd:string"/>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>    
    </xsd:complexType>   
  </xsd:element>
</xsd:schema>
</code>

Ваш Ответ

2   ответа
6

elementFormDefault="qualified" атрибут вxs:schema элемент вашего файла XSD.

Я думаю, что валидатор говорит, что хочетMRIDNumber элемент без пространства имен, вместо вашегоMRIDNumber элемент с пространством именurn:GenericLabData.

Error: User Rate Limit Exceeded Keith Sirmons
Error: User Rate Limit Exceededstackoverflow.com/questions/10779764/…Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededxfront.com/DefaultNamespace.html
1

Вы также включили PrescribedTestDate в XSD?

Я не уверен, почему вы получаете ошибку, ссылающуюся на MRIDNumber, если проблема связана с PrescribedTestDate, но я вижу разницу в вашем сгенерированном XML и рабочем XML (а также XSD) в том, что ни рабочий XML, ни XSD содержит PrescribedTestDate. Я хочу убедиться, что он там есть, и посмотреть, исчезнет ли ошибка.
Error: User Rate Limit Exceeded Keith Sirmons
Error: User Rate Limit Exceeded Keith Sirmons

Похожие вопросы