39 votes

Comment vérifier la validité xml en entrée de chaîne avant d'appeler .LoadXml()

Je préférerais de beaucoup le faire sans l'interception d'une exception en LoadXml() et d'utilisation de ces résultats dans le cadre de ma logique. Toutes les idées pour une solution qui n'implique pas manuellement l'analyse du xml moi-même? Je pense que VB a une valeur de retour de faux pour cette fonction au lieu de lancer une XmlException. D'entrée Xml est fourni par l'utilisateur. Merci beaucoup!

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

62voto

Rasmus Faber Points 24195

Il suffit de prendre l'exception. La faible surcharge de l'interception d'une exception se noie par rapport à l'analyse du XML.

Si vous souhaitez que la fonction (pour des raisons de style, pas pour la performance), de mettre en œuvre vous-même:

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

10voto

Sunny Milenov Points 10978

À l'aide d'un XmlValidatingReader permettra d'éviter les exceptions, si vous fournissez votre propre ValidationEventHandler.

6voto

Dan Points 1

Je n'ai pu obtenir XmlValidatingReader & ValidationEventHandler de travail. Le XmlException est encore jetés pour mal formée xml. J'ai vérifié en regardant les méthodes avec réflecteur.

J'ai en effet besoin de valider les 100s de court XHTML fragments 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 fonctionne pas non plus.

Quelqu'un réussir avec une regex?

3voto

Martín Marconcini Points 7420

Si la capture est trop pour vous, alors vous voudrez peut valider le XML à l'avance, à l'aide d'un Schéma XML, afin de s'assurer que le XML est ok, Mais qui sera probablement pire que de l'attraper.

1voto

Martín Marconcini Points 7420

COMME il a déjà été dit, je préfère attraper l'exception, mais à l'aide de XmlParserContext, vous pourriez essayer d'analyser "à la main" et d'intercepter toute anomalie; cependant, sauf si vous êtes l'analyse de 100 fragments xml par seconde, pourquoi ne pas la capture de l'exception?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X