Errore del pacchetto di agilità HTMl che analizza e restituisce XElement

.net-3.5 c# html-agility-pack html-parsing

Domanda

Posso analizzare il documento e generare un output, ma l'output non può essere analizzato in un XElement a causa del tag ap, tutto il resto all'interno della stringa viene analizzato correttamente.

Il mio contributo:

var input = "<p> Not sure why is is null for some wierd reason!<br><br>I have implemented the auto save feature, but does it really work after 100s?<br></p> <p> <i>Autosave?? </i> </p> <p>we are talking...</p><p></p><hr><p><br class=\"GENTICS_ephemera\"></p>";

Il mio codice:

var input = "<p> Not sure why is is null for some wierd reason!<br><br>I have implemented the auto save feature, but does it really work after 100s?<br></p> <p> <i>Autosave?? </i> </p> <p>we are talking...</p><p></p><hr><p><br class=\"GENTICS_ephemera\"></p>";

La mia uscita:

var input = "<p> Not sure why is is null for some wierd reason!<br><br>I have implemented the auto save feature, but does it really work after 100s?<br></p> <p> <i>Autosave?? </i> </p> <p>we are talking...</p><p></p><hr><p><br class=\"GENTICS_ephemera\"></p>";

Il grassetto tag è quello che non è stato pubblicato correttamente ... C'è un modo per aggirare questo? Sto facendo qualcosa di sbagliato con il codice?

Risposta accettata

Quello che stai cercando di fare è sostanzialmente trasformare un input Html in un output Xml.

Html Agility Pack può farlo quando si utilizza l'opzione OptionOutputAsXml , ma in questo caso non si dovrebbe usare la proprietà InnerHtml e lasciare che il pacchetto agilità Html faccia il lavoro di base per voi, con uno dei metodi di Save di HtmlDocument.

Ecco una funzione generica per convertire un testo Html in un'istanza XElement:

public static XElement HtmlToXElement(string html)
{
    if (html == null)
        throw new ArgumentNullException("html");

    HtmlDocument doc = new HtmlDocument();
    doc.OptionOutputAsXml = true;
    doc.LoadHtml(html);
    using (StringWriter writer = new StringWriter())
    {
        doc.Save(writer);
        using (StringReader reader = new StringReader(writer.ToString()))
        {
            return XElement.Load(reader);
        }
    }
}

Come vedi, non devi fare molto lavoro da solo! Si noti che poiché il testo di input originale non ha alcun elemento radice, il Agility Pack Html aggiungerà automaticamente uno SPAN allegato per garantire che l'output sia un Xml valido.

Nel tuo caso, vuoi elaborare ulteriormente alcuni tag, quindi ecco come fare con il tuo esempio:

public static XElement HtmlToXElement(string html)
{
    if (html == null)
        throw new ArgumentNullException("html");

    HtmlDocument doc = new HtmlDocument();
    doc.OptionOutputAsXml = true;
    doc.LoadHtml(html);
    using (StringWriter writer = new StringWriter())
    {
        doc.Save(writer);
        using (StringReader reader = new StringReader(writer.ToString()))
        {
            return XElement.Load(reader);
        }
    }
}

Come puoi vedere, non dovresti usare la funzione di stringa grezza, ma invece usare le funzioni DOM di Html Agility Pack (SelectNodes, Aggiungi, Rimuovi, ecc ...).


Risposta popolare

Se controlli i commenti della documentazione per OptionFixNestedTags vedrai quanto segue:

//     Defines if LI, TR, TH, TD tags must be partially fixed when nesting errors
//     are detected. Default is false.

Quindi non penso che questo ti aiuterà con tag p HTML non chiusi. Secondo una vecchia libreria C # di domande SO per ripulire il html anche se HTML Tidy potrebbe funzionare per questo scopo.




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é