2016-01-20 7 views
0

У меня есть C# скрипт, который проверяет документ XML против XSD документа следующим образом:Проверка XML против XSD всегда возвращает истину

static bool IsValidXml(string xmlFilePath, string xsdFilePath) 
    { 

     XmlReaderSettings settings = new XmlReaderSettings(); 
     settings.Schemas.Add(null, xsdFilePath); 
     settings.ValidationType = ValidationType.Schema; 
     settings.Schemas.Compile(); 

     try 
     { 
      XmlReader xmlRead = XmlReader.Create(xmlFilePath, settings); 
      while (xmlRead.Read()) 
      { }; 
      xmlRead.Close(); 
     } 
     catch (Exception e) 
     { 
      return false; 
     } 

     return true; 
    } 

Я собрал это после того, глядя на ряд статей и вопросов MSDN здесь, где это решение. Он корректно подтверждает, что XSD сформирован хорошо (возвращает false, если я возился с файлом) и проверяет, что XML сформирован хорошо (также возвращает false при запуске).

Я также попытался следующие, но это не одно и то же:

static bool IsValidXml(string xmlFilePath, string xsdFilePath) 
    { 

     XDocument xdoc = XDocument.Load(xmlFilePath); 
     XmlSchemaSet schemas = new XmlSchemaSet(); 
     schemas.Add(null, xsdFilePath); 

     try 
     { 
      xdoc.Validate(schemas, null); 
     } 
     catch (XmlSchemaValidationException e) 
     { 
      return false; 
     } 

     return true; 
    } 

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

Использование .NET 3.5 в задании SSIS.

+1

Вы не указали какие-либо особенности, но если вы проверяете XML со случайными схемами, это, вероятно, ожидается. Лучшее, что вы получите, это предупреждение, если в документе нет соответствующих элементов схемы. –

+4

Возможный дубликат [Проверка правильности документов XML с XSD] (http://stackoverflow.com/questions/16755058/validating-xml-documents-with-xsd-correctly) –

+1

Убедитесь, что пространство имен в XML-документе совпадает с тем, нацеленный на схему. Может быть полезно опубликовать пример схемы и xml-файлов, которые вы пытаетесь проверить. – SCB

ответ

0

В .NET вы должны проверить себя, действительно ли валидатор соответствует компоненту схемы; если это не так, исключений не будет, поэтому ваш код не будет работать так, как вы ожидаете.

матч означает один или оба из следующих действий:

  • есть один глобальный элемент в вашей схеме набора с квалифицированным именем, которое так же, как квалифицированное имя вашего элемента документа XML.
  • Элемент документа имеет атрибут xsi: type, который является квалифицированным именем, указывающим на глобальный тип в вашем наборе схем.

В потоковом режиме вы можете легко проверить это. Это псевдо-рода-оф-код должен дать Вам идею (обработка ошибок не показана, и т.д.):

using (XmlReader reader = XmlReader.Create(xmlfile, settings)) 
{ 
    reader.MoveToContent(); 
    var qn = new XmlQualifiedName(reader.LocalName, reader.NamespaceURI); 
    // element test: schemas.GlobalElements.ContainsKey(qn); 
    // check if there's an xsi:type attribute: reader["type", XmlSchema.InstanceNamespace] != null; 
    // if exists, resolve the value of the xsi:type attribute to an XmlQualifiedName 
    // type test: schemas.GlobalTypes.ContainsKey(qn); 
    // if all good, keep reading; otherwise, break here after setting your error flag, etc. 
} 

Вы могли бы также рассмотреть XmlNode.SchemaInfo, которая представляет проверки InfoSet после схемы, которая была назначена на узел в результате проверки схемы. Я бы испытал разные условия и посмотрел, как это работает для вашего сценария. Первый метод рекомендуется уменьшить поверхность атаки в DoS-атаках, так как это самый быстрый способ обнаружения полностью поддельных полезных нагрузок.

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