2008-09-17 12 views
36

Preferiría hacer esto sin capturar una excepción en LoadXml() y usar estos resultados como parte de mi lógica. ¿Alguna idea para una solución que no implique analizar manualmente el xml? Creo que VB tiene un valor de retorno de falso para esta función en lugar de arrojar una XmlException. La entrada Xml es proporcionada por el usuario. ¡Muchas gracias!Cómo comprobar si hay xml válido en la entrada de cadena antes de llamar a .LoadXml()

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

Respuesta

55

Sólo atrapa la excepción. La pequeña sobrecarga de atrapar una excepción se ahoga en comparación con el análisis del XML.

Si desea que la función (por razones de estilo, no para el rendimiento), aplicar usted mismo:

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

Esto ocurre en la carga de la página en un entorno de carga muy alta, la sobrecarga de la excepción es pequeña, pero lo suficientemente significativa como para evitarla. –

+4

¿Has hecho las mediciones para probar esto? Además, recuerde que el try-catch solo impone su penalización de rendimiento (relativamente pequeña) si realmente se lanza la excepción. –

+3

¿De dónde viene el XML? Si está esperando XML válido la mayor parte del tiempo, no vale la pena sobrecargarlo en cada llamada. Solo maneje la excepción y continúe. –

10

El uso de un XmlValidatingReader impedirá que las excepciones, si proporciona su propia ValidationEventHandler.

1

como ya se ha dicho, prefiero detectar la excepción, pero utilizando XmlParserContext, podría intentar analizar "manualmente" e interceptar cualquier anomalía; sin embargo, a menos que esté analizando 100 fragmentos xml por segundo, ¿por qué no detectar la excepción?

3

Si la captura es demasiado para usted, entonces es posible que desee validar el XML de antemano, utilizando un esquema XML, para asegurarse de que el XML está bien, pero eso probablemente será peor que la captura.

6

No he podido obtener XmlValidatingReader & ValidationEventHandler para que funcione. La XmlException todavía se lanza para xml incorrectamente formado. Lo verifiqué viendo los métodos con reflector.

De hecho necesito validar cientos de fragmentos cortos de 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 no funcionaba tampoco.

¿Alguien tiene éxito con una expresión regular?

+6

> ¿Alguien tiene éxito con un regx? Me recuerda a una cita famosa: "Algunas personas, cuando se enfrentan con un problema, piensan" Lo sé, usaré expresiones regulares ". Ahora tienen dos problemas". –

+0

Estás bromeando sobre la expresión regular, ¿verdad? Herramienta incorrecta para el trabajo por completo. Básicamente es el mismo problema que este: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – Anthony

+0

este texto no válido pasa por válido: sdf >>>> Amit

Cuestiones relacionadas