Come verificare la presenza di XML valido nell'input di stringa prima di chiamare .LoadXml()

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

Domanda

Preferirei di gran lunga farlo senza fare eccezioni LoadXml() e utilizzare questo risultato come parte della mia logica.Qualche idea per una soluzione che non implichi l'analisi manuale dell'xml da solo?Penso che VB abbia un valore restituito false per questa funzione invece di lanciare una XmlException.L'input XML viene fornito dall'utente.Grazie mille!

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

Soluzione

Prendi solo l'eccezione.Il piccolo sovraccarico derivante dall'acquisizione di un'eccezione viene annullato rispetto all'analisi dell'XML.

Se desideri la funzione (per ragioni stilistiche, non per prestazioni), implementala tu stesso:

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

Altri suggerimenti

L'utilizzo di un XmlValidatingReader impedirà le eccezioni, se fornisci il tuo ValidationEventHandler.

Non sono riuscito a far funzionare XmlValidatingReader e ValidationEventHandler.L'XmlException viene comunque generata per XML formato in modo errato.L'ho verificato visualizzando i metodi con riflettore.

Ho davvero bisogno di convalidare centinaia di brevi frammenti XHTML al secondo.

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;
}

Anche XmlParserContext non ha funzionato.

Qualcuno riesce con una regex?

Se catturare è troppo per te, potresti voler convalidare l'XML in anticipo, utilizzando uno schema XML, per assicurarti che l'XML sia ok, ma probabilmente sarà peggio che catturare.

COME già detto, preferirei cogliere l'eccezione, ma usando XmlParserContext, potresti provare ad analizzare "manualmente" e intercettare qualsiasi anomalia;tuttavia, a meno che non si stiano analizzando 100 frammenti xml al secondo, perché non rilevare l'eccezione?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top