it-swarm-pt.tech

Como verificar se há xml válido na entrada de string antes de chamar .LoadXml ()

Eu preferiria fazer isso sem capturar uma exceção em LoadXml() e usar esses resultados como parte da minha lógica. Alguma idéia para uma solução que não envolva analisar manualmente o xml sozinho? Eu acho que VB tem um valor de retorno false para esta função em vez de lançar um XmlException. A entrada Xml é fornecida pelo usuário. Muito obrigado!

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

Apenas pegue a exceção. A pequena sobrecarga de capturar uma exceção se afoga em comparação com a análise do XML.

Se você deseja a função (por razões estilísticas, não de desempenho), implemente-a:

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

O uso de um XmlValidatingReader impedirá as exceções, se você fornecer seu próprio ValidationEventHandler.

10
Sunny Milenov

Não foi possível obter o XmlValidatingReader & ValidationEventHandler para funcionar. O XmlException ainda é lançado para xml formado incorretamente. Eu verifiquei isso visualizando os métodos com refletor.

Eu realmente preciso validar centenas de pequenos fragmentos XHTML por segundo.

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 também não funcionou.

Alguém tem sucesso com uma regex?

6
Dan

Se a captura for demais para você, convém validar o XML antecipadamente, usando um esquema XML, para garantir que o XML esteja correto, mas isso provavelmente será pior do que a captura.

3
Martin Marconcini

Como já foi dito, prefiro capturar a exceção, mas usando XmlParserContext , você pode tentar analisar "manualmente" e interceptar qualquer anomalia; no entanto, a menos que você esteja analisando 100 fragmentos de xml por segundo, por que não capturar a exceção?

1
Martin Marconcini