web-dev-qa-db-fra.com

Comment vérifier le xml valide dans l'entrée de chaîne avant d'appeler .LoadXml ()

Je préférerais de loin le faire sans intercepter une exception dans LoadXml() et utiliser ces résultats dans le cadre de ma logique. Des idées pour une solution qui n'implique pas d'analyser manuellement le xml moi-même? Je pense que VB a une valeur de retour false pour cette fonction au lieu de lancer une XmlException. L'entrée Xml est fournie par l'utilisateur. Merci beaucoup!

if (!loaded)
{
     this.m_xTableStructure = new XmlDocument();
     try
     {
          this.m_xTableStructure.LoadXml(input);
          loaded = true;
     }
     catch
     {
          loaded = false;
     }
}
39
Chris Ballance

Attrapez juste l'exception. Le petit surcoût lié à la capture d'une exception se noie par rapport à l'analyse du XML.

Si vous voulez la fonction (pour des raisons stylistiques, pas pour les performances), implémentez-la vous-même:

public class MyXmlDocument: XmlDocument
{
  bool TryParseXml(string xml){
    try{
      ParseXml(xml);
      return true;
    }catch(XmlException e){
      return false;
    }
 }
60
Rasmus Faber

L'utilisation d'un XmlValidatingReader empêchera les exceptions, si vous fournissez votre propre ValidationEventHandler.

10
Sunny Milenov

Je n'ai pas réussi à faire fonctionner XmlValidatingReader & ValidationEventHandler. L'exception XmlException est toujours levée pour le xml mal formé. J'ai vérifié cela en consultant les méthodes avec réflecteur.

J'ai en effet besoin de valider 100s de courts fragments XHTML par seconde.

public static bool IsValidXhtml(this string text)
{
   bool errored = false;
   var reader = new XmlValidatingReader(text, XmlNodeType.Element, new XmlParserContext(null, new XmlNamespaceManager(new NameTable()), null, XmlSpace.None));
   reader.ValidationEventHandler += ((sender, e) => { errored = e.Severity == System.Xml.Schema.XmlSeverityType.Error; });

   while (reader.Read()) { ; }
   reader.Close();
   return !errored;
}

XmlParserContext ne fonctionnait pas non plus.

Quelqu'un réussit avec une expression régulière?

6
Dan

Si la capture est trop pour vous, alors vous voudrez peut-être valider le XML au préalable, à l'aide d'un schéma XML, pour vous assurer que le XML est correct, mais ce sera probablement pire que la capture.

3
Martin Marconcini

Comme cela a déjà été dit, je préfère attraper l'exception, mais en utilisant XmlParserContext , vous pouvez essayer d'analyser "manuellement" et d'intercepter toute anomalie; cependant, à moins que vous n'analysiez 100 fragments xml par seconde, pourquoi ne pas intercepter l'exception?

1
Martin Marconcini