1

Можно ли взять XML-файл, хранящийся в свойстве HttpPostedFileBase (из формы MVC), и создать объект XMLReader.Create (.., ..), поддерживая номера строк?HttpPostedFileBase to XmlReader.Create()

В приведенном ниже примере используется жестко запрограммированный местоположение XML-файла ..

В идеале XmlReader.Create (MyHttpPostedFileBase, RS);

public static bool Validate() 
    { 
     try 
     {   
      string XsdPath = @"C:\Projects\Mvc\Xsd\books.xsd"; 
      string XmlPath = @"C:\Projects\Mvc\Xsd\food.xml"; //replace with my HttpPostedFileBase 

      XmlSchemaSet set = new XmlSchemaSet(); 
      set.Add(null, XsdPath); 

      XmlReaderSettings rs = new XmlReaderSettings(); 
      rs.Schemas = set; 
      rs.ValidationType = ValidationType.Schema; 
      rs.ValidationEventHandler += new ValidationEventHandler(rs_ValidationEventHandler); 

      using (XmlReader reader = XmlReader.Create(XmlPath, rs)) 
      { 
       while (reader.Read()) ; 
      } 
     } 

static void rs_ValidationEventHandler(object sender, ValidationEventArgs e) 
    {      
     //code 
    } 

ответ

1

Удалось решить проблему - надеюсь, это поможет другим.

Проблема с созданием XmlDocument из загрузки XttpPostedFileBase Xml заключается в том, что компонент XmlDocument не поддерживает номера строк.

Решение состояло в том, чтобы создать поток из HttpPostedFileBase и вставить его в XmlReader.Create().

Приведенный ниже код выполняет две функции: подтверждает, что XML является действительным, а затем проверяет, чем XML соответствует XSD.

Примечание: У меня не было времени, чтобы реорганизовать код достаточно, но оно должно быть достаточно понятно

public HttpPostedFileBase MyFile { get; set; } 

public Stream GetXmlStream() 
    { 
     using (Stream inputStream = MyFile.InputStream) 
     { 
      MemoryStream memoryStream = inputStream as MemoryStream; 
      memoryStream = new MemoryStream(); 
      inputStream.CopyTo(memoryStream); 
      memoryStream.Position = 0; 
      return memoryStream; 
     } 
    } 

public class XmlValidator 
{ 
    public string Error; 

    public bool ValidateXml(Stream memoryStream) 
    { 
     try 
     { 
      string XsdPath = @"C:\Projects\Mvc\Xsd\books.xsd"; 
      XmlReaderSettings settings = new XmlReaderSettings(); 
      settings.Schemas.Add("", XsdPath); 
      settings.ValidationType = ValidationType.Schema; 
      XmlReader reader = XmlReader.Create(memoryStream, settings); 
      XmlDocument document = new XmlDocument(); 

      try 
      { 
       document.Load(reader); 
      } 
      catch (XmlException ex) 
      { 
       UploadedFile.Error = String.Format("Line {0}, position {1}: {2}", ex.LineNumber, ex.LinePosition, 
        ex.Message); 
       return false; 
      } 

      ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler); 
      document.Validate(eventHandler); 
      reader.Close(); 
      return true; 
     } 
     catch (XmlSchemaValidationException ex) 
     { 
      UploadedFile.Error = String.Format("Line {0}, position {1}: {2}", ex.LineNumber, ex.LinePosition, ex.Message); 
     } 
     return false; 

    } 

    private void ValidationEventHandler(object sender, ValidationEventArgs e) 
    { 
    } 




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