HTMl 민첩성 팩 오류 해석 및 XElement 반환

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

문제

나는 문서를 파싱하고 출력을 생성 할 수있다. 그러나 ap 태그 때문에 출력을 XElement로 파싱 할 수는 없으며, 문자열 내의 다른 모든 것들은 정확하게 파싱된다.

내 입력 :

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>";

내 코드 :

public static XElement CleanupHtml(string input)
    {  


    HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();

    htmlDoc.OptionOutputAsXml = true;
    //htmlDoc.OptionWriteEmptyNodes = true;             
    //htmlDoc.OptionAutoCloseOnEnd = true;
    htmlDoc.OptionFixNestedTags = true;

    htmlDoc.LoadHtml(input);

    // ParseErrors is an ArrayList containing any errors from the Load statement
    if (htmlDoc.ParseErrors != null && htmlDoc.ParseErrors.Count() > 0)
    {

    }
    else
    {

        if (htmlDoc.DocumentNode != null)
        {
            var ndoc = new HtmlDocument(); // HTML doc instance
            HtmlNode p = ndoc.CreateElement("body");  

            p.InnerHtml = htmlDoc.DocumentNode.InnerHtml;
            var result = p.OuterHtml.Replace("<br>", "<br/>");
            result = result.Replace("<br class=\"special_class\">", "<br/>");
            result = result.Replace("<hr>", "<hr/>");
            return XElement.Parse(result, LoadOptions.PreserveWhitespace);
        }
    }
    return new XElement("body");

}

내 결과 :

<body>
   <p> Not sure why is is null for some wierd reason chappy!
   <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>**
   <hr/>
   <p>
   <br/>
   </p>
</body>

대담한 p 태그가 올바르게 출력되지 않았습니다 ...이 방법이 있습니까? 코드에 문제가 있습니까?

수락 된 답변

당신이하려는 것은 기본적으로 HTML 입력을 XML 출력으로 변환하는 것입니다.

Html 민첩성 팩은 OptionOutputAsXml 옵션을 사용할 때 그렇게 할 수 있지만,이 경우에는 InnerHtml 속성을 사용하지 말고 HtmlDocument의 Save 방법 중 하나를 사용하여 Html 민첩성 팩을 기반으로 기본 작업을 수행해야합니다.

다음은 HTML 텍스트를 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);
        }
    }
}

보시다시피, 당신은 혼자서 많은 일을 할 필요가 없습니다! 원본 입력 텍스트에는 루트 요소가 없기 때문에 Html Agility Pack은 출력이 유효한 XML인지 확인하기 위해 자동으로 SPAN 을 하나 추가합니다.

귀하의 경우에는 일부 태그를 추가로 처리하기를 원하므로 예제를 사용하는 방법은 다음과 같습니다.

    public static XElement CleanupHtml(string input)
    {
        if (input == null)
            throw new ArgumentNullException("input");

        HtmlDocument doc = new HtmlDocument();
        doc.OptionOutputAsXml = true;
        doc.LoadHtml(input);

        // extra processing, remove some attributes using DOM
        HtmlNodeCollection coll = doc.DocumentNode.SelectNodes("//br[@class='special_class']");
        if (coll != null)
        {
            foreach (HtmlNode node in coll)
            {
                node.Attributes.Remove("class");
            }
        }

        using (StringWriter writer = new StringWriter())
        {
            doc.Save(writer);
            using (StringReader reader = new StringReader(writer.ToString()))
            {
                return XElement.Load(reader);
            }
        }
    }

보시다시피, 원시 문자열 함수를 사용하지 말고 Html Agility Pack DOM 함수 (SelectNodes, Add, Remove 등)를 사용하십시오.


인기 답변

OptionFixNestedTags 대한 문서 주석을 확인하면 다음을 볼 수 있습니다 :

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

그래서 이것이 닫히지 않은 HTML p 태그에 도움이 될 것이라고 생각하지 않습니다. HTML Tidy 가이 목적을 위해 작동 할지도 모르지만 HTML 을 정리 하는 오래된 SO 질문 C # 라이브러리 에 따르면.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.