Cum pot defila ușor entități XML în .NET

Am un cod care returnează InnerXML pentru un XMLNode.

Nodul poate conține doar un text (cu HTML) sau XML.

De exemplu:


    Here is some <strong>HTML</strong>

sau


    Here is some content

if I get the InnerXML fsau 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 sau not and act accsaudingly.

Cred că aș putea folosi HTMLDecode, dar va decoda toate entitățile codate XML?

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

Am un document xml care arată astfel:


    <p>A Test</p>


    
        A test
    

Daca eu fac:

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 va reveni

 <p>A Test</p>

xn2 will return A test

Am verificat deja pentru a vedea dacă ceea ce este returnat este xml (în cazul lui xn2), deci tot ce trebuie să fac este să nu scap de & lt; etc în xn1.

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

2

3 răspunsuri

Întrebarea dvs. este puțin greu de urmat. Iată lucrurile pe care nu le înțelegeam pe deplin:

  1. Dacă utilizați obiecte XmlNode/XmlElement, lucrați cu XML, nu cu HTML. Tot ceea ce puteți avea sunt elementele XML. Acestea pot avea nume de elemente HTML, dar sunt XML.
  2. InnerXml returnează un șir, cel puțin pentru obiectul XmlElement. Cu ce ​​lucrezi?
  3. Ce date așteptați să ieșiți din operațiune? Puteți da un exemplu despre ceea ce aveți nevoie?
  4. Ce anume intenționați să faceți cu datele când le aveți? Poate că există o cale mai bună spre obiectivul dvs. decât ceea ce are în minte?

EDIT

Cred că am imaginea, dar corectați-mă dacă încă mă înșel. Doriți să scoateți din xn1 "

A Test

" xn2 .

Deci, InnerXml este calea de parcurs pentru xn1 , iar InnerText ar fi potrivit pentru xn2 .

Atunci faceti-o asa - testati existenta dataitem si decideti ce sa faceti cand stiti.

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

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

Pentru a răspunde la întrebarea dvs. cu privire la HttpUtility.HtmlDecode , m-am uitat la implementare și se pare că ar "lucra pentru tot", dar mi se pare inutil dacă șirul pe care îl căutați apare din InnerXml .

2
adăugat

de ce nu le inserați ca & lt; și> ? evitați amestecarea chestiilor xml și personalizate cu acest ...

2
adăugat
Acesta este un răspuns valid, exemplul furnizat în întrebare nu este valabil XML
adăugat autor Mitchel Sellers, sursa
Am actualizat exemplul pentru a repara sintaxa incorectă. Acest răspuns nu este de fapt un răspuns relevant la întrebare, dar accept că exemplul meu a fost rău.
adăugat autor Tim Saunders, sursa

Cred că Tomalak este pe drumul cel bun, dar aș scrie codul puțin diferit:

        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.");
        }

Acest cod face foarte multe ipoteze implicite explicit, iar când întâlniți date care nu sunt în forma pe care o așteptați, vă va spune de ce a eșuat.

1
adăugat