HtmlAgilityPack: come faccio a combinare elementi html in un unico tag con una classe?

html-agility-pack vb.net

Domanda

Problema: devo esaminare alcuni elementi HTML utilizzando HtmlAgilityPack e combinare i nomi dei tag. È possibile estrarre ogni tag, dal genitore al figlio, sostituendolo con uno span che ha una classe con un nome di "strikingUEmStrong". Inoltre, il nome cambia in base all'elemento HTML.

L'ordine del nome della classe in effetti conta, me ne sono reso conto attraverso prove ed errori. Finché è in grado di ottenere tutti gli elementi e combinarli insieme. È molto probabile che abbia più nodi di testo con vari livelli di formattazione.

Questo influenzerà più paragrafi.

Ad esempio, se ho questo codice html:

<p>
<strike><u><em><strong>four styles</strong></em></u></strike></p>

Come posso convertirlo in questo:

<p>
<strike><u><em><strong>four styles</strong></em></u></strike></p>

È possibile avere anche questo tipo di codice:

<p>
<strike><u><em><strong>four styles</strong></em></u></strike></p>

L'output dovrebbe assomigliare a questo:

<p>
<strike><u><em><strong>four styles</strong></em></u></strike></p>

Prototipo:

<p>
<strike><u><em><strong>four styles</strong></em></u></strike></p>

Produzione:

<p>
<strike><u><em><strong>four styles</strong></em></u></strike></p>

Finalmente ottenere il risultato giusto, dopo aver risolto il problema degli ordini. Grazie per l'aiuto.

Risposta accettata

Questa non è una domanda semplice da rispondere. Descriverò come scriverei l'algoritmo per farlo e includere alcuni pseudo-codice per aiutare.

  1. Otterrei il mio tag padre. Immagino che tu voglia fare questo per tutti i tag "p"
  2. Ho eseguito un'iterazione sui tag dei miei figli, prendendo il nome del tag e aggiungendolo in un nome di classe
  3. Avrei ricorsivamente ripetuto i bambini finché non avrò il mio nome di tag aggiunto

Pseudo-codice. Si prega di scusare qualsiasi refuso, mentre sto scrivendo questo al volo.

public string GetClassName(Node n)
{
var ret = n.TagName;

foreach(var child in n.ChildNodes)
{
ret += GetClassName(child);
}

return ret;
}


foreach(var p in paragraphs)
{
foreach(var child in p.ChildNodes)
{
 var span = new Span();
 span.InnerText = child.InnerText; // strip all tags, just take the inner text

span.ClassName = GetClassName(child);

child.ReplaceWith(span); // note: if you do this with a FOREACH and not a for loop, it'll blow up C# for modifying the collection while iterating.  Use for loops. if you're going to do "active" replacement like in this pseudo code
}
}

Sarei felice di modificare la mia risposta una volta ottenuto più contesto. Si prega di rivedere quello che sto suggerendo e commentarlo con più contesto se avete bisogno di me per perfezionare il mio suggerimento. Se no, spero che questo ti porti ciò di cui hai bisogno :)




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é