Comment vérifier si un fichier XML valide est entré dans une chaîne de caractères avant d'appeler .LoadXml ()

StackOverflow https://stackoverflow.com/questions/86292

Question

Je préférerais de beaucoup le faire sans capturer 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 l'analyse manuelle du code XML moi-même? Je pense que VB a une valeur de retour de 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;
     }
}
Était-ce utile?

La solution

Attrapez juste l'exception. La petite surcharge due à la capture d’une exception se noie par rapport à l’analyse du code XML.

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

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

Autres conseils

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

Je n'ai pas pu obtenir XmlValidatingReader & amp; ValidationEventHandler au travail. 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.

Je dois en effet valider 100 s 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 n'a pas fonctionné non plus.

Quelqu'un at-il réussi avec un regex?

Si attraper est trop pour vous, alors vous voudrez peut-être valider le XML au préalable, en utilisant un schéma XML, pour vous assurer que le XML est correct, mais ce sera probablement pire que de l'attraper.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top