Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

XML Validation (Code)

Îåêßíçóå áðü ôï ìÝëïò cap. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 13-05-2008, 13:20. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  25-01-2005, 11:10 981

    XML Validation (Code)

    Απλά θα ήθελα τα σχόλιά σας. Ο κώδικας αυτός προϋποθέτει οτι έχεις δύο IO.Streams, ένα για το xml και ένα για το xsd και τα κάνει validate. (Τα είχα embedded σε dlls). Αν σας αρέσει, να το βάλουμε στο library (οταν και αν φτιαχτεί). Αν οχι, πείτε μου τι δεν.



    'Method to validate an XML file using a given XSD file.

    'Both files must be in the form of System.IO.Streams

    Public Shared Sub ValidateXML( _

       ByVal xmlSettingsStream As Stream _

       , ByVal xsdStream As Stream)


       Dim
    tr As XmlTextReader = New XmlTextReader(xmlSettingsStream)

       Dim sc As XmlSchemaCollection = New XmlSchemaCollection

       Dim vr As XmlValidatingReader = New XmlValidatingReader(tr)

       Dim objTrXsd As XmlTextReader = New XmlTextReader(xsdStream)


       Try

          sc.Add(Nothing, objTrXsd)

          vr.ValidationType = ValidationType.Schema

          vr.Schemas.Add(sc)

          
          While
    (vr.Read())

          End While


       Catch
    ex As Exception

       
          'Rethrow exception to caller. Expected XMLException here.

          Throw (ex)

       
       Finally

       
       'Cleanup

          Try

             vr = Nothing

             sc = Nothing

             tr = Nothing

          
          Catch
    exc As Exception

             'do nothing

          End Try

       End Try





    End Sub





     






    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  25-01-2005, 15:37 998 σε απάντηση της 981

    Re: XML Validation (Code)

     cap wrote:

    ...
       Catch
    ex As Exception

       
          'Rethrow exception to caller. Expected XMLException here.

          Throw (ex)

       
       Finally

    ... 




    Μια μικρή ένσταση ώς προς το Throw(ex)

    Διορθώστε με αν κάνω λάθος, αλλά νομίζω ότι εφ' όσον δεν πρόκειται να κάνεις τίποτα για το exception και θέλεις απλά να το κάνεις propagate, είναι καλύτερο να κάνεις απλά Throw (χωρίς argument) έστι ώστε να μην χάσεις το call stack από τα exceptions.

    Εναλλακτικά, μπορείς να κάνεις
    Τhrow(new Exception("my error info",ex))
    έτσι ώστε και πάλι να διατηρήσεις το αρχικό exception ως inner exception πλέον


    Vir prudens non contra ventum mingit
  •  25-01-2005, 15:47 999 σε απάντηση της 998

    Re: XML Validation (Code)

    Εχεις απόλυτο δίκιο ως προς το throw. Εκ παραδρομής το είχα αποθηκεύσει με throw (ex). Αν θέλει κάποιος να κάνει propagate και ταυτόχρονα να διατηρήσει το call stack, πρέπει να χρησιμοποιεί throw σκέτο, χωρίς ζάχαρη Smile.
    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  02-08-2005, 12:19 3945 σε απάντηση της 981

    Απ:XML Validation (Code)

    Αν θες οπωσδήποτε παρατηρήσεις:

    α) δεν νομίζω ότι απαιτείται το finally clean-up αφού όλα τα objects που χρησιμοποιείς είναι managed.

    β) βάλε τα variable declarations και initializations μέσα στο try/catch block ώστε να πιάσεις και τα errors που μπορεί να συμβούν κατά το initialization των variables.

    γ) μετέτραψε το sub σε ένα function που να επιστρέφει true ή false αντί να πετάς exceptions. Στην περίπτωση αυτή μπορείς να προσθέσεις μια τελευταία bool παράμετρο στο function που να καθορίζει τι θα κάνεις με τα exceptions.

    π.χ. (σε C#)

    public bool ValidateXML(Stream xml, Stream xsd, bool throwMeAllExceptions)
    {
          try
          {
                <do your stuff>
          }
          catch (Exception e)
          {
                if (throwMeAllExceptions)
                      throw;
                else return false;
          }
          return true;
    }

    και προσθέτεις και ένα orverload ώστε να είναι optional η bool (νομίζω ότι σε VB μπρορείς να την κάνεις optional με κάποιο keyword)

    public bool ValidateXML(Stream xml, Stream xsd)
    {
          return ValidateXML(xml, xsd, false);
    }

    δ) αν θες να το κάνεις ακόμα καλύτερο μπορείς να πιάνεις χωριστά τα XMLExceptions από όλα τα υπόλοιπα οπότε αν πρόκειται για Validation πρόβλημα και σου έχει δώσει throwMeAllExceptions = false τότε του επιστρέφεις false για validation errors αλλά του πετάς όλα τα άλλα exceptions δηλαδή

    public bool ValidateXML(Stream xml, Stream xsd, bool throwMeAllExceptions)
    {
          try
          {
                <do your stuff>
          }
          catch (XMLException e)
          {
                if (throwMeAllExceptions)
                      throw;
                else return false;
          }
          return true;
    }

    οπότε θα το πιάσεις μόνο αν είναι XMLException. Όλα τα άλλα θα πάνε στους από πάνω handlers. Αντίστοιχα μπροείς να προσθέσεις ένα σκέτο catch{} το οποίοα θα πιάνει όλα τα υπόλοιπα exceptions και θα τα "πνίγει".

    αυτά.. Smile [:)]


    rousso
  •  12-05-2008, 10:32 41911 σε απάντηση της 3945

    XML Validation & Shared Methods

    Είπα να ποστάρω εδώ το πρόβλημά μου, μιας και είναι κοινό το θέμα. Προσπαθώ να φτιάξω μια εφαρμογούλα που να διαβάζει xml documents και να κάνει κάποιους υπολογισμούς. Υπάρχει δύο απαιτήσεις όμως:

    1)      Εάν το xml δεν είναι σύμφωνο με το αντίστοιχο xsd (validation fails), να μην επεξεργάζεται το αρχείο

    2)      Να μπορούν να τρέξουν πολλά instances της εφαρμογής παράλληλα για διαφορετικά αρχεία.

    Όσες απόπειρες για xml validation έχω δει στο νετ χρησιμοποιούν shared variables & methods, κάτι που ενδεχομένως όμως προκαλεί πρόβλημα για multiple instancing.

    Έχει κανείς να προτείνει κάποιον εναλλακτικό τρόπο για xml validation?

    Thanks in advance…

  •  13-05-2008, 12:09 41957 σε απάντηση της 41911

    Απ: XML Validation & Shared Methods

    Δε νομίζω ότι το πρόβλημά σου είναι πραγματικά πρόβλημα ρε arish ... αν δε θές να χρησιμοποιήσεις shared [ static ] μεθόδους και μεταβλητές ... πείραξε λίγο το πρώτο sample που θα βρείς στο Google .. . και κάντες κανονικές μεθόδους και μεταβλητές μιας κλάσσης Big Smile



    Angel
    O:]
  •  13-05-2008, 13:20 41965 σε απάντηση της 999

    Απ: Re: XML Validation (Code)

    Εδώ που τα λέμε, δεν χρειάζεται καν το Catch αφού δεν πρόκειται να κάνεις κάτι με το exception. Επίσης, το καθάρισμα των XmlTextReader, XMLValidatingReader μπορείς να το κάνεις με ένα using, οπότε δεν χρειάζεται ούτε το Finally.

     


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems