remarks - params comments c#
Cómo comprobar si hay xml válido en la entrada de cadena antes de llamar a.LoadXml() (5)
Como ya se dijo, preferiría detectar la excepción, pero al usar XmlParserContext , podrías 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?
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!
if (!loaded)
{
this.m_xTableStructure = new XmlDocument();
try
{
this.m_xTableStructure.LoadXml(input);
loaded = true;
}
catch
{
loaded = false;
}
}
El uso de un XmlValidatingReader evitará las excepciones si proporciona su propio ValidationEventHandler.
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.
Solo 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 la función (por razones estilísticas, no por rendimiento), impleméntela usted mismo:
public class MyXmlDocument: XmlDocument
{
bool TryParseXml(string xml){
try{
ParseXml(xml);
return true;
}catch(XmlException e){
return false;
}
}
No pude hacer que XmlValidatingReader & ValidationEventHandler 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 tampoco funcionó.
Alguien tiene éxito con una expresión regular?