Pergunta

Eu prefiro muito mais para fazer isso sem pegar uma exceção no LoadXml() e usando este resultado como parte de minha lógica. Alguma idéia para uma solução que não envolve manualmente analisar o xml-me? Eu acho que VB tem um valor de retorno de falsa para esta função em vez de jogar um XmlException. xml de entrada é fornecida a partir do utilizador. Muito obrigado!

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

Solução

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

Se você quiser que a função (por razões estilísticas, não para desempenho), implementá-lo:

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

Outras dicas

Usando um XmlValidatingReader irá impedir as exceções, se você fornecer sua própria ValidationEventHandler.

eu era incapaz de obter XmlValidatingReader & ValidationEventHandler ao trabalho. O XmlException ainda é jogado para xml formada incorretamente. Verifiquei isso exibindo os métodos com refletor.

Eu, na verdade precisa 100s Validar de fragmentos XHTML curtas 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 não quer trabalhar.

Qualquer um sucesso com um regex?

Se a captura é demais para você, então você pode querer validar o XML de antemão, usando um esquema XML, para se certificar de que o XML é ok, mas que provavelmente será pior do que pegar.

Como já foi dito, eu prefiro capturar a exceção, mas usando XmlParserContext , você poderia tentar analisar 'manualmente' e interceptar qualquer anomalia; no entanto, a menos que você está analisando 100 fragmentos XML por segundo, por que não pegar a exceção?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top