¿Cómo puedo liberar entidades XML fácilmente en .NET?

Tengo un código que devuelve InnerXML para un XMLNode.

El nodo puede contener solo texto (con HTML) o XML.

Po ejemplo:


    Here is some <strong>HTML</strong>

o


    Here is some content

if I get the InnerXML fo the HTML tags are returned as xml entities.

I cannot use InnerText because I need to be able to get the xml contents. So all I really need is a way to un-escape the HTML tags, because I can detect if it's xml o not and act accodingly.

Supongo que podría usar HTMLDecode, pero ¿decodificará todas las entidades codificadas en XML?

Update: I guess I'm rambling a bit above so here is a clarified scenario:

Tengo un documento xml que se ve así:


    <p>A Test</p>


    
        A test
    

Si lo hago:

XmlNode xn1 = document.SelectSingleNode("/content[@id=1]/data");
XmlNode xn2 = document.SelectSingleNode("/content[@id=2]/data");

Console.WriteLine(xn1.InnerXml);
Console.WriteLine(xn2.InnerXml);    

xn1 regresará

 <p>A Test</p>

xn2 will return A test

Ya estoy comprobando si lo que se devuelve es xml (en el caso de xn2), así que todo lo que necesito hacer es liberarme de & lt; etc. en xn1.

HTMLDecode does this, but I'm not sure it would wok fo everything. So the question remains would HTMLDecode handle all the possible entities o is there a class somewhere that will do it fo me.

2

3 Respuestas

Tu pregunta es un poco difícil de seguir. Aquí están las cosas que no entendí completamente:

  1. Si está utilizando objetos XmlNode/XmlElement, está trabajando con XML, no con HTML. Entonces todo lo que puedes tener son elementos XML. Estos pueden tener nombres de elementos HTML, pero son XML.
  2. InnerXml devuelve una cadena, al menos para el objeto XmlElement. ¿Con qué estás trabajando?
  3. ¿Qué datos espera obtener de la operación? ¿Puedes dar un ejemplo de lo que necesitas?
  4. ¿Qué pretendes hacer exactamente con los datos cuando los tienes? Tal vez hay una manera mejor para su objetivo que lo que tenemos en mente?

EDITAR

Creo que entiendo la imagen, pero corrígeme si todavía estoy equivocado. Desea arrancar "

A Test

" de xn1 , pero "A test" de xn2 .

Así que InnerXml es el camino a seguir para xn1 , y InnerText sería correcto para xn2 .

Bien, hazlo de esa manera: prueba la existencia de dataitem y decide qué hacer cuando lo sepas.

XmlNode xn = document.SelectSingleNode("/content[@id=1]/data");

if (xn.SelectSingleNode("dataitem") == null)
  Console.WriteLine(xn.InnerXml);
else
  Console.WriteLine(xn.InnerText);

Para responder a su pregunta con respecto a HttpUtility.HtmlDecode , solo miré la implementación y parece que "funcionaría para todo", pero me parece superfluo si sale la cadena que está buscando. de InnerXml .

2
agregado

por qué no insertarlos como & lt; y & gt; ? evitas mezclar xml y material de marcado personalizado con esto ...

2
agregado
Esta es una respuesta válida, el ejemplo proporcionado en la pregunta NO es xml válido
agregado el autor Mitchel Sellers, fuente
He actualizado el ejemplo para corregir la sintaxis incorrecta. Esta respuesta no es realmente una respuesta relevante a la pregunta, pero acepto que mi ejemplo fue malo.
agregado el autor Tim Saunders, fuente

Creo que Tomalak está en el camino correcto, pero escribiría el código un poco diferente:

        XmlNode xn = document.SelectSingleNode("/content[@id=1]/data");
        if (xn.ChildNodes.Count != 1)
        {
            throw new InvalidOperationException("I don't know what to do if there's not exactly one child node.");
        }
        XmlNode child = xn.ChildNodes[0];
        switch (child.NodeType)
        {
            case XmlNodeType.Element:
                Console.WriteLine(xn.InnerXml);
                break;
            case XmlNodeType.Text:
                Console.WriteLine(xn.Value);
                break;
            default:
                throw new InvalidOperationException("I can only handle elements and text nodes.");
        }

Este código hace explícitas muchas de sus suposiciones implícitas, y cuando encuentra datos que no están en la forma esperada, le dirá por qué fallaron.

1
agregado