2017-02-22 55 views
2

Я пытаюсь проверить свой xml-файл с помощью XmlSchemaSet, но по какой-то причине ошибка не попадает, когда я читаю xml. Я почти уверен, что проблема не в моем xml или xsd, потому что, когда у меня есть xml open в visual studio, это на самом деле говорит мне, что мой атрибут содержит недопустимое значение.Проверка Xml с использованием xsd not caught

Xml:

<Test xmlns:testns="http://schemas.testnamespace.com/" xmlns="http://schemas.testnamespace.com/" 
    testns:foo="-903" /> 

XSD (пример взят из документации Microsoft по XSD: союз)

<?xml version="1.0"?> 

<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://schemas.testnamespace.com/" 
    xmlns="http://schemas.testnamespace.com/" 
    elementFormDefault="qualified" 
    attributeFormDefault="qualified" > 

    <xs:element name="Test" > 
     <xs:complexType> 

      <xs:attribute name="foo"> 
       <xs:simpleType> 
        <xs:union memberTypes="fontbynumber fontbystringname" /> 
       </xs:simpleType> 
      </xs:attribute> 

     </xs:complexType> 
    </xs:element> 

    <xs:simpleType name="fontbynumber"> 
     <xs:restriction base="xs:positiveInteger"> 
      <xs:maxInclusive value="72"/> 
     </xs:restriction> 
    </xs:simpleType> 

    <xs:simpleType name="fontbystringname"> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="small"/> 
      <xs:enumeration value="medium"/> 
      <xs:enumeration value="large"/> 
     </xs:restriction> 
    </xs:simpleType> 

</xs:schema> 

Код проверки:

XmlSchemaSet sc = new XmlSchemaSet(); 

//Passing null instead of the namespace doesn't change anything 
sc.Add("http://schemas.testnamespace.com/", "Bar.xsd"); 
sc.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack); 
sc.Compile(); 

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.ValidationType = ValidationType.Schema; 
//I've tried all combinations of ValidationFlags and it doesn't change anything 
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema; 
settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings; 
settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack); 
settings.Schemas = sc; 

using(XmlReader reader = XmlReader.Create(path, settings)) 
{ 
    while(reader.Read()) ; 
} 

Я чувствую, что проблема может быть в потому что всякий раз, когда я использовал объединение или список, он никогда не ловит какую-либо ошибку, но как только я просто использую ограничение без союза или список он ловит ошибку ..

Пожалуйста, помогите :(

ответ

0

Тестирование на .net 2.0 & 4,61, и она работает, как ожидалось.

У вас есть нужный файл в переменной «путь»?

enter image description here

+0

Да правильный путь и XSD также работает, потому что, если добавить недопустимый атрибут ошибка попадается или если у меня есть только ограничение и не объединение ошибка также попадается. Я использую .net 3.5, я действительно потерялся сейчас, у нас есть тот же код, как моя ошибка не попалась? Хм, я попытаюсь использовать .net 4.61 и посмотреть, не изменит ли это что-нибудь. – FlyOff

+0

Единственное различие заключалось в том, что вы использовали консольное приложение, когда я использовал среду Unity Engine, поэтому я создал проект приложения тестовой консоли, поместил там код и работал.? Это самое странное из когда-либо, потому что все другие ошибки пойманы, кроме одного, и я не понимаю, почему это имеет значение для окружающей среды. В любом случае я попытаюсь изучить это дальше, спасибо за помощь. – FlyOff

+0

Нечетная, какую версию System.Xml.dll вы ссылаетесь? – Sprotty

 Смежные вопросы

  • Нет связанных вопросов^_^