Ich habe eine Zeichenfolge, die den inneren Wert eines DIV (mit bearbeitbarem Inhalt) enthält, der von der Clientseite stammt.
In diesem Div gibt es SPAN, P, Table, alles, was man haben kann.

Ich möchte aus dieser Zeichenfolge nur den Wert innerhalb des P-Elements und manchmal innerhalb des TD der Tabellen abrufen (manchmal befindet sich ein P innerhalb des TD, manchmal nicht) und den Wert abrufen, wenn er sich innerhalb eines DIV-Elements befindet .

Die Zeichenfolge kann sein:

string text = @"
<P>
    tset if it work 
    <SPAN onresizestart="return false" ondrag=javascript:dragActif(); contentEditable=false style="BACKGROUND-COLOR: #c0d4e6" edth_type="var" edth_var_pob="n" edth_var_pgm="RBLZVALO" edth_var_def="B" edth_var_casse="car" edth_var_lg="050" edth_var_type="c" edth_var_nom="Adr_Leg_Lig1" edth_var_lib="Ligne 1 adresse légale" edth_var_libc="Adr_Leg_Lig1" edth_var_num="1" edth_var_posFich="0">
       Adr_Leg_Lig1
    </SPAN> 
    test
</P>
<P>This <FONT size=2 edth_sizeUTIA4="8">should</FONT> Work
</P>"

Ich habe versucht, es mit XML zu analysieren

XmlDocument xd = new XmlDocument();
xd.LoadXML(text);

Aber es ist fehlgeschlagen, ich versuche es damit in HTML zu analysieren ParseHTML aber es auch gescheitert.

Ich habe versucht, jede Möglichkeit mit Regex zu filtern, aber manchmal müssen wir das nehmen, was sich in <FONT> befindet, wie in diesem Beispiel, manchmal nicht.

Gibt es eine Möglichkeit, dies mit ASP.NET auf der Serverseite in HTML zu konvertieren oder in eine Art XML zu konvertieren, mit der ich es mit seinem Tag und Attribut innerhalb des Tags bearbeiten kann?

BEARBEITEN: ASP.NET 2.0, IE5, No Jquery (also IE5) sind meine Konfiguration, ich kann keine externen Bibliotheken verwenden.

0
Slayner 5 Jän. 2016 im 14:05

4 Antworten

Beste Antwort

Das Parsen von HTML-Dosen ist im Allgemeinen schwierig und es gibt viele Randfälle, an die man denken sollte. Daher würde ich die Verwendung einer externen Bibliothek wie HTMLAgilityPack empfehlen. Wenn Ihr Client keine externen Bibliotheken zulässt, können Sie einfach den Quellcode dafür herunterladen und die relevanten Projekte in Ihre Lösung aufnehmen.

Mit HTMLAgilityPack und dem folgenden Codefragment erhalte ich folgende Ausgabe:

test if it work test
this should Work

Möglicherweise müssen Sie nach zusätzlichen Elementen filtern und den XPath-Ausdruck genauer anpassen.

using System;
using System.Linq;
using HtmlAgilityPack;

namespace MongoDB
{

    public class Program
    {

        public static void Main()
        {
            string text =
                "<p>tset if it work <span onresizestart=\"return false\" ondrag=javascript:dragActif(); contenteditable=false style=\"BACKGROUND-COLOR: #c0d4e6\" edth_type=\"var\" edth_var_pob=\"n\" edth_var_pgm=\"RBLZVALO\" edth_var_def=\"B\" edth_var_casse=\"car\" edth_var_lg=\"050\" edth_var_type=\"c\" edth_var_nom=\"Adr_Leg_Lig1\" edth_var_lib=\"Ligne 1 adresse légale\" edth_var_libc=\"Adr_Leg_Lig1\" edth_var_num=\"1\" edth_var_posfich=\"0\">Adr_Leg_Lig1</span> test</p><p>This <font size=2 edth_sizeutia4=\"8\">should</font> Work</p>";

            HtmlDocument html = new HtmlDocument();
            html.LoadHtml(text);

            var nodes = html.DocumentNode.SelectNodes("//p");

            foreach (
                var line in
                    nodes.Select(node => node.ChildNodes.Where(childNode => childNode.Name!="span"))
                        .Select(
                            textNodes => textNodes.Aggregate(String.Empty, (current, node) => current + node.InnerText))
                )
            {
                Console.WriteLine(line);
            }
        }
    }
}
1
Alex 5 Jän. 2016 im 12:01

Es ist unwahrscheinlich, aber wenn Sie den von Ihnen angegebenen Code verwenden, können Sie einige geringfügige Änderungen vornehmen

string text = "<ME><P>tset if it work <SPAN onresizestart='return false' ondrag='javascript:dragActif();' contentEditable='false' style='BACKGROUND-COLOR: #c0d4e6' edth_type='var' edth_var_pob='n' edth_var_pgm='RBLZVALO' edth_var_def='B' edth_var_casse='car' edth_var_lg='050' edth_var_type='c' edth_var_nom='Adr_Leg_Lig1' edth_var_lib='Ligne 1 adresse légale' edth_var_libc='Adr_Leg_Lig1' edth_var_num='1' edth_var_posFich='0'>Adr_Leg_Lig1</SPAN> test</P><P>This <FONT size='2' edth_sizeUTIA4='8'>should</FONT> Work</P></ME>";

XDocument xd = XDocument.Parse(text);

Ich musste es mit einem Unsinn-Tag (<ME>) umschließen, sonst hat es mehrere Wurzeln

Ich musste auch sicherstellen, dass Sie nach = 2 ' ' haben! zB hatte dein Original:

This <FONT size=2 

Wo ich verwendet habe

This <FONT size='2' 

Screenshot mit dem XML-Visualizer

enter image description here

1
MyDaftQuestions 5 Jän. 2016 im 11:21

HTML ist normalerweise kein gültiges XML. Sie müssen einen Parser verwenden, der HTML aus Zeichenfolgen analysieren kann, aus denen Sie Inhalte extrahieren können.

Ich mache viel Web-Scraping und habe festgestellt, dass CSQuery den Trick gut macht. Es konvertiert HTML in ein speicherinternes DOM, das mit Funktionen / Selektoren abgefragt werden kann, genau wie die von jQuery bereitgestellten.

0
Gone Coding 5 Jän. 2016 im 11:21

In diesem Thread erfahren Sie, wie Sie eine HTML-Datei mit einem regulären Ausdruck oder mit dem Agility Pack analysieren: Wie entferne ich alle HTML-Tags aus einem String, ohne zu wissen, welche Tags darin enthalten sind?

0
Community 23 Mai 2017 im 10:28