HTMLAgility Pack può lasciare tag non chiusi?

c# html-agility-pack

Domanda

Ho bisogno di analizzare una stringa HTML come questa:

<widget attribute="1">
  <header>
    <table>
  </header>
  <item>
    <tr><td>content</td></tr>
  </item>
  <footer>
    </table>
  </footer>
</widget>

Sto usando Html Agility Pack e sono in grado di trovare tutti i "widget":

HtmlDocument doc = new HtmlDocument();
doc.OptionAutoCloseOnEnd = false;
doc.OptionOutputAsXml = false;
doc.LoadHtml(htmlString); 
HtmlNodeCollection widgets = doc.DocumentNode.SelectNodes("//widget");

Il mio problema è quando cerco di ottenere tutti i childnodes del nodo Widget. HTMLAgility chiude automaticamente tutti i miei tag, quindi non sono in grado di recuperare correttamente i nodi Header, Item e Footer. L'output generato da Agility è:

<header>
    <table>
</table></header>
<item>
    <tr>
        <td><p>Riga n.1</p></td>
    </tr>
</item>
<footer>

</footer>

Chiude il tag Table nell'intestazione e nasconde il tag Table nel piè di pagina. C'è un modo per lasciare questi tag non chiusi? Ho provato a cercare documentazione sulla logica del metodo LoadHtml ma non ho trovato nulla. Penso di aver bisogno di giocare con Options.

Mi potete aiutare?

Risposta popolare

Html Agility Pack in genere non supporta la sovrapposizione di tag in base alla progettazione. Tuttavia, puoi modificarlo in questo modo:

HtmlDocument doc = new HtmlDocument();
HtmlNode.ElementsFlags.Add("table", HtmlElementFlag.CanOverlap | HtmlElementFlag.Empty);
doc.LoadHtml(htmlString); 

In questo caso, si ordina alla libreria di trattare TABLE come un tag sovrapposto. Come nota a margine, FORM è l'unico TAG predefinito definito come tag sovrapposto (vedere il motivo qui: HtmlAgilityPack - <form> si chiude per qualche motivo? ).

Tuttavia, questo non viene come un pranzo gratis ...

Significa che la libreria ora vedrà cosa c'è dentro la tabella e i tag della tabella di chiusura come un puro elemento di testo. Quindi tutti i tag all'interno della tabella analizzata non saranno accessibili a livello di codice, non lo vedrai nel DOM, non lo vedrai usando XPATH, ecc ... ma potrebbe essere sufficiente per le tue esigenze.



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é