Wie entziehe ich XML-Entities einfach in .NET

Ich habe Code, der InnerXML für einen XMLNode zurückgibt.

Der Knoten kann nur etwas Text (mit HTML) oder xml enthalten.

Beispielsweise:


    Here is some <strong>HTML</strong>

oder


    Here is some content

if I get the InnerXML foder 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 oder not and act accoderdingly.

Ich denke, ich könnte HTMLDecode verwenden, aber wird dies alle XML-kodierten Entitäten decodieren?

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

Ich habe ein XML-Dokument, das so aussieht:


    <p>A Test</p>


    
        A test
    

Wenn ich mache:

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 wird zurückkehren

 <p>A Test</p>

xn2 will return A test

Ich überprüfe bereits, ob das, was zurückgegeben wird, xml ist (im Fall von xn2), also muss ich nur den & lt; usw. in xn1 entschlüsseln.

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

2

3 Antworten

Ihre Frage ist ein bisschen schwer zu folgen. Hier sind die Dinge, die ich nicht vollständig verstanden habe:

  1. Wenn Sie XmlNode/XmlElement-Objekte verwenden, arbeiten Sie mit xml und nicht mit HTML. Alles, was Sie haben können, sind XML-Elemente. Diese können HTML-Elementnamen haben, aber sind XML.
  2. InnerXml gibt eine Zeichenfolge mindestens für das XmlElement-Objekt zurück. Woran arbeitest du?
  3. Welche Daten erwarten Sie von der Operation? Können Sie ein Beispiel geben, was Sie brauchen?
  4. Was genau beabsichtigen Sie mit den Daten zu tun, wenn Sie sie haben? Vielleicht gibt es einen besseren Weg zu Ihrem Ziel als das, was Sie vorhaben?

BEARBEITEN

Ich denke, ich bekomme das Bild, aber korrigieren Sie mich, wenn ich immer noch falsch liege. Sie möchten "

A Test

" aus xn1 , aber "A test" aus extrahieren xn2 .

Also InnerXml ist der Weg zu xn1 und InnerText wäre der richtige für xn2 .

Nun tue es so - teste auf die Existenz von dataitem und entscheide, was zu tun ist, wenn du es weißt.

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

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

Um Ihre Frage zu HttpUtility.HtmlDecode zu beantworten, habe ich mir die Implementierung angeschaut und es sieht so aus, als würde sie "für alles funktionieren", aber es erscheint mir überflüssig, wenn die gesuchte Zeichenkette rauskommt von InnerXml .

2
hinzugefügt

warum sie nicht als & lt; und & gt; ? Du vermeidest es, xml und benutzerdefinierte Markup-Sachen mit diesem zu mischen ...

2
hinzugefügt
Dies ist eine gültige Antwort. Das in der Frage angegebene Beispiel ist kein gültiger XML-Code
hinzugefügt der Autor Mitchel Sellers, Quelle
Ich habe das Beispiel aktualisiert, um die falsche Syntax zu beheben. Diese Antwort ist nicht wirklich eine relevante Antwort auf die Frage, aber ich akzeptiere mein Beispiel war schlecht.
hinzugefügt der Autor Tim Saunders, Quelle

Ich denke, Tomalak ist auf dem richtigen Weg, aber ich würde den Code etwas anders schreiben:

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

Dieser Code macht viele Ihrer impliziten Annahmen explizit, und wenn Sie auf Daten stoßen, die nicht in der von Ihnen erwarteten Form vorliegen, werden Sie erfahren, warum sie fehlgeschlagen ist.

1
hinzugefügt