AngleSharp解析为有效的HTML<;脚本>;和XML

AngleSharp解析为有效的HTML<;脚本>;和XML,anglesharp,Anglesharp,我正在使用AngleSharp为站点编写解析器,我需要最终获得XML 在xml中解析时,解析节脚本会出现问题,因为存在这样的符号“”。 编号的行上出现错误 我如何解决这种情况(我需要使用AngleSharp)?我尝试了不同的网站,结果是一样的 var config = Configuration.Default .WithCss() .WithDefaultLoader();

我正在使用AngleSharp为站点编写解析器,我需要最终获得XML

在xml中解析时,解析节脚本会出现问题,因为存在这样的符号“”。 编号的行上出现错误

我如何解决这种情况(我需要使用AngleSharp)?我尝试了不同的网站,结果是一样的

        var config = Configuration.Default
                      .WithCss()
                      .WithDefaultLoader();
        var address = Url.Create("https://www.google.com/");
        var document = BrowsingContext.New(config).OpenAsync(address).GetAwaiter().GetResult();

        XmlDocument xmlDocument = new XmlDocument();
        var xDocument = new HtmlParser().Parse(document.DocumentElement.InnerHtml);
        var formatter = new AngleSharp.Xml.XmlMarkupFormatter();
        var result = xDocument.ToHtml(formatter);
        xmlDocument.LoadXml(result); //1

        var parserXML = new XmlParser().Parse(document.DocumentElement.InnerHtml);//2
        xmlDocument.LoadXml(parserXML.ToHtml());

XML与HTML不兼容,尽管它们非常相似。所以一般来说,这是不可能的,但是,当你定义如何处理差异时,你可能会得到一个可以接受的结果

在这种转换的核心,需要定义以下函数。我们只考虑4种节点类型-不应该出现任何其他节点类型。为了简单起见,我们放弃了任何名称空间的元素或属性

静态XmlNode CreateNodeFrom(XmlDocument文档,INode源代码)
{
开关(source.NodeType)
{
case节点类型。注释:
返回document.CreateComment(source.TextContent);
case NodeType.Element:
var原始=(IEElement)源;
var元素=document.CreateElement(original.LocalName);
foreach(原始.Attributes中的var attr)
{
SetAttribute(attr.Name,attr.Value);
}
返回元素;
案例节点类型。文本:
返回document.CreateTextNode(source.TextContent);
违约:
返回null;
}
}
该功能几乎完全由树转换器使用:

静态子节点(INode源、XmlNode目标)
{
var owner=target.OwnerDocument;
foreach(source.ChildNodes中的var child)
{
var node=CreateNodeFrom(所有者、子级);
target.AppendChild(节点);
追加子节点(子节点、节点);
}
}
所以我们只是走在树上,把我们看到的转化成。。。更改原始功能:

var config=Configuration.Default.WithCss().WithDefaultLoader();
var address=Url.Create(“https://www.google.com/");
var document=BrowsingContext.New(config).OpenAsync(address).Result;
var xmlDocument=新的xmlDocument();
var root=CreateNodeFrom(xmlDocument,document.DocumentElement);
AppendChild(根);
AppendChildren(document.DocumentElement,根);
(我不知道为什么要使用所有这些不同的解析器;解析器在文本级别上工作,但HTML和XML在文本级别上是不兼容的——所以让我们尝试在DOM级别上进行转换,这是我们可以控制发生的事情的地方)

我删除了一些冗余并改进了async->sync桥接器(但我鼓励您删除
.Result
并使用
wait
,即返回
任务而不是
XmlDocument

希望这有帮助