Pregunta

Estoy trabajando en Microsoft Visual C# 2008 Express.

Digamos que tengo una cadena y el contenido de la cadena es: "This is my <myTag myTagAttrib="colorize">awesome</myTag> string."

Me digo a mí mismo que quiero hacer algo a la palabra "impresionante", posiblemente llamar a una función que hace algo llamado "colorice".

¿Cuál es la mejor manera en C# para detectar que esta etiqueta existe y obtener ese atributo? He trabajado un poquito con xelements y tal en C#, pero principalmente con la lectura de los archivos XML de entrada y salida.

¡Gracias!

-Adena

¿Fue útil?

Solución

Otra solución:

var myString = "This is my <myTag myTagAttrib='colorize'>awesome</myTag> string.";
try
{
    var document = XDocument.Parse("<root>" + myString + "</root>");
    var matches = ((System.Collections.IEnumerable)document.XPathEvaluate("myTag|myTag2")).Cast<XElement>();
    foreach (var element in matches)
    {
        switch (element.Name.ToString())
        {
            case "myTag":
                //do something with myTag like lookup attribute values and call other methods
                break;
            case "myTag2":
                //do something else with myTag2
                break;
        }
    }
}
catch (Exception e)
{
    //string was not not well formed xml
}

También tuve en cuenta su comentario a Dabblernl, donde desea analizar múltiples atributos en múltiples elementos.

Otros consejos

Puede extraer el XML con una expresión regular, cargar la cadena XML extraída en un xelement y ir desde allí:

string text=@"This is my<myTag myTagAttrib='colorize'>awesome</myTag> text.";
Match match=Regex.Match(text,@"(<MyTag.*</MyTag>)");
string xml=match.Captures[0].Value;
XElement element=XElement.Parse(xml);
XAttribute attribute=element.Attribute("myTagAttrib");
if(attribute.Value=="colorize") DoSomethingWith(element.Value);// Value=awesome

Este código lanzará una excepción si no se encontró ningún elemento mytag, pero eso se puede remediar insertando una línea de:

if(match.Captures.Count!=0)
{...}

Se vuelve aún más interesante si la cadena podría contener más que solo la etiqueta mytag ...

Estoy un poco confundido sobre su ejemplo, porque cambia entre la cadena (contenido de texto), las etiquetas y los atributos. Pero creo que lo que quieres es XPATH.

Entonces, si su transmisión XML se ve así:

u003Cadeena/>u003Cparent>u003Cchild x="this is my awesome string">Esta es otra cadena impresionanteu003Cchild/>u003Cadeena/>

Utilizaría una expresión de XPath que se vea así para encontrar el atributo:

// niño/@x

Y uno como este para encontrar el valor de texto bajo la etiqueta infantil:

//niño

Soy un desarrollador de Java, así que no sé qué bibliotecas XML usarías para hacer esto. Pero necesitará un analizador DOM para crear una instancia de clase de documento W3C para usted leyendo en el archivo XML y luego usando XPATH para eliminar los valores.

Hay un buen Tutorial de XPath de las escuelas W3C si lo necesitas.

ACTUALIZAR:

Si está diciendo que ya tiene una transmisión XML como cadena, entonces la respuesta es no leerlo desde un archivo sino de la cadena en sí. Java tiene abstracciones llamadas InputStream y Reader que manejan flujos de bytes y caracteres, respectivamente. La fuente puede ser un archivo, una cadena, etc. Verifique su API C# DOM para ver si tiene algo similar. Pasará la cadena a un analizador que devolverá un objeto DOM que pueda manipular.

Dado que la entrada no es XML bien formada, no podrá analizarla con ninguna de las bibliotecas XML incorporadas. Necesitaría una expresión regular para extraer la pieza bien formada. Probablemente podrías usar uno de los analizadores HTML más indulgentes como Htmlagilitypack en CodePlex.

los XmlTextReader puede analizar fragmentos XML con un constructor especial que mayo Ayuda en esta situación, pero no soy positivo al respecto.

Hay un artículo en profundidad aquí:

http://geekswithblogs.net/kobush/archive/2006/04/20/75717.aspx

Esta es mi solución para que coincida con cualquier tipo de XML usando regex:C# ¿Mejor forma de detectar XML?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top