Seleziona tutti gli elementi DOM con HTMLAgilityPack

.net c# dom html html-agility-pack

Domanda

Ho cercato domande simili e ho cercato on-line, ma non riesco a trovare una soluzione. Quello che sto cercando di fare è selezionare tutti gli elementi DOM in ordine (ecc.) E poi metterli in un arraylist o qualcosa del genere.

attualmente ho

public void Parse()
    {
        HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();

        // There are various options, set as needed
        //htmlDoc.OptionFixNestedTags = true;

        // filePath is a path to a file containing the html
        htmlDoc.Load("Test.html");

        // Use:  htmlDoc.LoadHtml(xmlString);  to load from a string (was htmlDoc.LoadXML(xmlString)

        // ParseErrors is an ArrayList containing any errors from the Load statement
        if (htmlDoc.ParseErrors != null && htmlDoc.ParseErrors.Count() > 0)
        {
            Console.WriteLine("There was an error parsing the HTML file");
        }
        else
        {
            if (htmlDoc.DocumentNode != null)
            {
                htmlDoc.DocumentNode.Descendants();

                Console.WriteLine("document node not null");
                //HtmlAgilityPack.HtmlNode bodyNode = htmlDoc.DocumentNode.SelectSingleNode("//body");

                foreach (HtmlNode node in htmlDoc.DocumentNode.Descendants())
                {
                    Console.WriteLine(node.Name);
                }
            }
        }
    }

Il code out inserisce il nome del nodo (html, titolo, immagine, ecc.) Ma emette i tag di chiusura come "#text". Presumo che questo sia dovuto al fatto che i tag iniziano con un "/" Come posso ottenere una lettura corretta di tutti gli elementi DOM?

Risposta accettata

"#text" è il nome dei nodi di testo e i tag di chiusura non sono rappresentati come qualcosa di unico nel DOM.

<div><span>foo</span> bar</div>

Ti darà l'albero come

<div><span>foo</span> bar</div>

Risposta popolare

Sospetto che gli elementi #text che hai visto siano interruzioni di riga anziché la chiusura del tag. Ad esempio questo input html:

<div>
    <a href="http://example.org"></a>
</div>

usando il tuo codice verrà prodotto:

<div>
    <a href="http://example.org"></a>
</div>

È possibile utilizzare questa query XPath invece, per ottenere tutti gli elementi quelli non sono nodi di testo semplice (ignorando quelle interruzioni di riga non necessarie):

<div>
    <a href="http://example.org"></a>
</div>

Che XPath significa, seleziona tutti i discendenti dell'elemento corrente con qualsiasi nome ( * ).




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché