c# - without - try catch visual basic




¿Comprobar XML bien formado sin un try/catch? (6)

¿Alguien sabe cómo puedo verificar si una cadena contiene XML bien formado sin usar algo como XmlDocument.LoadXml() en un bloque try / catch? Tengo una entrada que puede o no ser XML, y quiero un código que reconozca que la entrada no sea XML sin confiar en un try / catch, tanto por la velocidad como por el principio general de que las circunstancias no excepcionales no deberían aumentar. excepciones Actualmente tengo un código que hace esto;

private bool IsValidXML(string value)
    {
        try
        {
            // Check we actually have a value
            if (string.IsNullOrEmpty(value) == false)
            {
                // Try to load the value into a document
                XmlDocument xmlDoc = new XmlDocument();

                xmlDoc.LoadXml(value);

                // If we managed with no exception then this is valid XML!
                return true;
            }
            else
            {
                // A blank value is not valid xml
                return false;
            }
        }
        catch (System.Xml.XmlException)
        {
            return false;
        }
    }

Pero parece algo que no debería requerir el try / catch. La excepción está causando un feliz infierno durante la depuración porque cada vez que reviso una cadena, el depurador se romperá aquí, "ayudándome" con mi molesto problema.


La clase XmlTextReader es una implementación de XmlReader y proporciona un analizador rápido y eficaz. Hace cumplir las reglas de que XML debe estar bien formado. No es un analizador de validación ni de validación, ya que no tiene información de DTD o esquema. Puede leer texto en bloques o leer caracteres de una secuencia.

Y un ejemplo de otro artículo de MSDN al que he agregado código para leer todo el contenido de la secuencia XML.

string str = "<ROOT>AQID</ROOT>";
XmlTextReader r = new XmlTextReader(new StringReader(str));
try
{
  while (r.Read())
  {
  }
}
finally
{
  r.Close();
}

fuente: http://bytes.com/topic/c-sharp/answers/261090-check-wellformedness-xml


Agregue el atributo [System.Diagnostics.DebuggerStepThrough] al método IsValidXml . Esto evita que el depurador capture la excepción XmlException, lo que significa que puede activar la captura de excepciones de primer cambio y este método en particular no se depurará.


Mis dos centavos. Esto fue bastante simple y sigue algunas convenciones comunes ya que se trata de analizar ...

public bool TryParse(string s, ref XmlDocument result)
{
    try {
        result = new XmlDocument();
        result.LoadXml(s);
        return true;
    } catch (XmlException ex) {
        return false;
    }
}

No conozco una forma de validar sin la excepción, pero puede cambiar la configuración del depurador para que solo se rompa para XmlException si no se XmlException , eso debería resolver sus problemas inmediatos, incluso si el código aún no es elegante.

Para hacer esto, vaya a Debug / Exceptions ... / Common Language Runtime Exceptions y encuentre la excepción System.Xml.XmlException, luego asegúrese de que solo esté marcado "No manejado por el usuario" (no arrojado).


Precaución con el uso de XmlDocument porque es posible cargar un elemento a lo largo de las líneas de <0>some text</0> usando XmlDocument doc = (XmlDocument)JsonConvert.DeserializeXmlNode(object) sin que se haya lanzado una excepción.

Los nombres de elementos numéricos no son xml válidos, y en mi caso no se produjo un error hasta que intenté escribir el xmlDoc.innerText en un tipo de datos del servidor Sql de xml.

Así lo valido ahora, y se lanza una excepción.
XmlDocument tempDoc = XmlDocument)JsonConvert.DeserializeXmlNode(formData.ToString(), "data"); doc.LoadXml(tempDoc.InnerXml);


Solo mis 2 centavos: hay varias preguntas sobre esto, y la mayoría de la gente está de acuerdo con el hecho de "basura en - basura fuera". No estoy en desacuerdo con eso, pero personalmente encontré la siguiente solución rápida y sucia, especialmente para los casos en los que tratas con datos xml de terceros que simplemente no se comunican contigo fácilmente. No evita el uso de try / catch, pero lo usa con una granularidad más fina, por lo que en los casos en que la cantidad de caracteres xml no válidos no es tan grande, ayuda .. Usé XmlTextReader y su método ReadChars () para cada elemento padre, que es uno de los comandos que no hacen chequeos bien formados, como ReadInner / OuterXml hace. Así que es una combinación de Read () y ReadChars () cuando Read () apuntala en un nodo padre. Por supuesto, esto funciona porque puedo suponer que la estructura básica del XML está bien, pero los contenidos (valores) de ciertos nodos pueden contener caracteres especiales que no se han reemplazado con & ..; equivalente ... (Encontré un artículo sobre esto en algún lugar, pero no puedo encontrar el enlace de fuente en este momento)







well-formed