Como faço para não-escape de entidades XML facilmente no .NET

Eu tenho algum código que retouna InnerXML para um XMLNode.

O nó pode conter apenas algum texto (com HTML) ou XML.

Pou exemplo:


    Here is some <strong>HTML</strong>

ou


    Here is some content

if I get the InnerXML fou 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 ou not and act accoudingly.

Eu acho que eu poderia usar HTMLDecode, mas isso decodificará todas as entidades codificadas em XML?

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

Eu tenho um documento xml que se parece com isso:


    <p>A Test</p>


    
        A test
    

Se eu fizer:

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 retornará

 <p>A Test</p>

xn2 will return A test

Eu já estou verificando se o que é retornado é xml (no caso de xn2), então tudo que eu preciso fazer é escapar do & lt; etc no xn1.

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

2

3 Respostas

Sua pergunta é um pouco difícil de seguir. Aqui estão as coisas que eu não entendi completamente:

  1. Se você estiver usando objetos XmlNode/XmlElement, estará trabalhando com XML, não com HTML. Então tudo que você pode ter são elementos XML. Eles podem ter nomes de elementos HTML, mas eles são XML.
  2. InnerXml retorna uma string, pelo menos para o objeto XmlElement. Com o que você está trabalhando?
  3. Quais dados você espera sair da operação? Você pode dar um exemplo do que você precisa?
  4. O que exatamente você pretende fazer com os dados quando os tiver? Talvez exista um caminho melhor para o seu objetivo do que o que você tem em mente?

EDITAR

Acho que entendi a foto, mas me corrija se ainda estou errada. Você quer arrancar "

Um Teste

" fora de xn1 , mas "Um teste" fora de xn2 .

Então InnerXml é o caminho a seguir para xn1 , e InnerText seria correto para xn2 .

Bem, faça isso dessa maneira - teste a existência de dataitem e decida o que fazer quando souber.

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

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

Para responder sua pergunta sobre o HttpUtility.HtmlDecode , eu olhei apenas para a implementação e parece que "funcionaria para tudo", mas parece-me supérfluo se a string que você está procurando está saindo de InnerXml .

2
adicionado

por que não inseri-los como & lt; e & gt; ? você evita misturar xml e coisas de marcação personalizadas com isso ...

2
adicionado
Esta é uma resposta válida, o exemplo fornecido na pergunta NÃO é xml válido
adicionado o autor Mitchel Sellers, fonte
Eu atualizei o exemplo para corrigir a sintaxe incorreta. Esta resposta não é realmente uma resposta relevante para a pergunta, mas eu aceito que meu exemplo foi ruim.
adicionado o autor Tim Saunders, fonte

Eu acho que Tomalak está no caminho certo, mas eu escreveria o código um pouco 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.");
        }

Esse código torna explícitas muitas de suas suposições implícitas, e quando você encontra dados que não estão na forma esperada, ele lhe dirá por que falhou.

1
adicionado