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;
}
}
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;
}
}
L'utilisation d'un XmlValidatingReader empêchera les exceptions, si vous fournissez votre propre ValidationEventHandler.
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?
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.
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?