【问题标题】:HTML to XHTML - skip some tags completely. (C# beginner)HTML 到 XHTML - 完全跳过一些标签。 (C#初学者)
【发布时间】:2024-01-06 05:45:01
【问题描述】:

我最近开始学习 C#。 MSDN 有一个示例,您可以通过直接获取 XML 文件来创建一个 RSS 应用程序,所以我尝试了自己的一些方法,并且像大多数时候一样,我没有做对。 把叹息声放在这里

由于页面是 HTML,我尝试寻找 HTML 到 XHTML 的转换器,我发现了这个(非常有趣)叫做 HTML-Cleaner

它用<dd> 标签替换了不需要的标签,但我想跳过这些标签,所以我自己做了修改:

public override bool Read()
{
  bool status = base.Read();
  if( status )
  {
    if( base.NodeType == XmlNodeType.Element )
    {
      dowrite = false;
      // Got a node with prefix. This must be one of those "<o:p>"
      // or something else.  Skip this node entirely. We want prefix-
      // less nodes so that the resultant XML requires no namespace.
      foreach (string line in AllowedTags)
      {
        if (base.Name == line || 
           (base.Name == "html" && first == false))
        { 
            dowrite = true; 
            first = true; 
        }
      } 

      if( base.Name.IndexOf(':') > 0 )
        dowrite=false;

      if(!dowrite)
        base.Skip();
    }
  }
    return status;
}

问题是它只打印一个&lt;dd&gt; 标签,没有别的。即使存在允许的标签,它也会跳过它们。

为什么会这样?任何帮助将不胜感激。如果您有其他方法,请随时提出建议。


编辑:无论如何要实现这个???

【问题讨论】:

  • 你知道,解析 XML 有更简单的方法——看看 Linq to xml (XDocument class et al),或者使用带有 SelectNodes() 方法的 XPath 表达式987654327@/XmlElement.此外,您可能想查看 HtmlAgilityPack(其 API 非常接近 XmlDocument 的模型,并使用 XPaths 进行查询)
  • HtmlAgilitypack 是一件很棒的事情,但是如果你能够将你的 html 转换为 xml,只保留你想要的标签,那么我想,使用 XPath 会更容易,还是和直接一样使用 HTmlAgilityPack.?

标签: c# xml xhtml


【解决方案1】:

看起来Read 方法返回的是 XML 节点,而不是标签,因此任何不匹配节点的全部内容都将被删除。

如果输入是一个典型的 HTML 文件,在递归 Read 方法中的某个时刻会找到“head”元素。这不在 AllowedTags 列表中,所以它的所有后代节点都是Skipped。

这同样适用于body 元素。它及其所有后代都将被跳过。

剩下的 html 元素在您的代码中匹配,因此被插入到 XML DOM 中。

由于html 不在AllowedTags 列表中,因此在HTMLWriter 阶段,html 标签将转换为dd 标签,这就是您所描述的输出。

我实际上并没有捆绑 html2xhtmlcleaner 代码,但我认为你需要调整编写器代码而不是阅读器代码来实现你想要做的事情。

【讨论】:

  • @TarunG - 假设您正在遵循 HTML-cleaner 示例代码,它将成为 writeNode 方法的内部实现的一部分,根据行 writer.WriteNode( reader, true );
  • 自过去 2 天以来我一直在尝试解决它,但是什么也没有,当我尝试修改写入标签时,我收到一个错误“NO XML tag open”..你能给我任何帮助如何做到这一点??
  • @TarunG - 根据您发布的代码很难做到这一点。我建议您打开一个新问题,发布您拥有的产生“未打开 XML 标记”错误的代码,并寻求有关您为什么会收到该错误的帮助。
最近更新 更多