代码之家  ›  专栏  ›  技术社区  ›  John K

如何使用HTML Agility Pack 1.4.0创建一个空的XHTML兼容P节点?

  •  0
  • John K  · 技术社区  · 14 年前

    但是,我尝试为p标记创建一个htmlnode并将其注入到htmldocument dom中,它始终显示为未关闭的标记。例如。

    // different ways I've tried creating the node:
    var p = HtmlNode.CreateNode("<p />");
    var p = HtmlNode.CreateNode("<p></p>");
    var p = HtmlNode.CreateNode("<p>");
    var p = HtmlTextNode.CreateNode("<p></p>");
    
    // some other properties I've played with:
    p.Name = "p";
    p.InnerHtml = "";
    

    他们最后都是一样的 <p> 在输出中使用 .Save() 方法。

    我想把它关好,像xhtml那样 <p /> <p></p> . 两者都可以。

    我的解决方法: 我能做的就是发行 CreateNode("<p> </p>") (中间有一个空格)它保留了整个源代码,但我认为必须有更好的方法。

    尝试或考虑的其他选项:

    • 当我打开选项时 .OutputAsXml 例如,它脱离现有实体 &nbsp; 转向 &amp;nbsp; 这不太理想,也不能关闭我注射的P标签。

    • 当我启用选项时 .OptionWriteEmptyNodes 它仍然没有关闭我的注入P标签。

    • 我看到Agility包包含枚举 HtmlElementFlag 带值 Closed, Empty, CData, CanOverlap (关闭可能有用),但看不到在创建新的元素/节点时将它应用到何处。
    1 回复  |  直到 14 年前
        1
  •  1
  •   John K    14 年前

    我找到了答案:必须在 HtmlDocument 实例使用 CreateElement(..) 工厂方法如下:

    var hdoc = new HtmlDocument(); // HTML doc instance
    // ... stuff
    HtmlNode p = hdoc.CreateElement("p");  // << will close itself for XHTML. 
    

    然后P会像这样关闭自己 <p /> .

    如果您像我在问题中尝试的那样使用htmlnode.createNode(..)工厂方法创建一个htmlnode实例,那么它在dom中的行为就与closure不同。