我最近开始学习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;
}
问题是它只打印一个<dd>
标签而没有其他内容。即使存在允许的标签,它也会跳过它们。
为什么会这样?任何帮助将不胜感激。如果您有其他方法,请随时提出建议。
答案 0 :(得分:2)
看起来Read
方法返回XML节点而不是标签,因此将删除任何不匹配节点的全部内容。
如果输入是典型的HTML文件,则在递归Read
方法的某个时刻,将找到“head”元素。这不在AllowedTags列表中,所以它的所有后代节点都是Skip
ped。
同样适用于body
元素。它及其所有后代都将被跳过。
留下html
元素,它在您的代码中匹配,因此插入到XML DOM中。
由于html
不在AllowedTags列表中,因此在HTMLWriter
阶段,html标记将转换为dd
标记,这就是您所描述的输出。
我实际上并没有对html2xhtmlcleaner代码进行捆绑,但我认为你需要调整编写器代码而不是读者代码来实现你想要做的事情。