XElement.Load()出现“未声明前缀”错误的解决方法

11

我正在获取一个网站的源代码,然后想提取其中的特定部分。我的意图是使用 LINQ-to-XML 来完成这个任务。

但是,在解析源代码时,我遇到了错误:

XElement source = XElement.Load(reader);

问题似乎是由于我没有的命名空间引用而导致的。我收到以下错误:'addthis' 是未声明的前缀。在第130行,第51个位置。 源于这一行:

<div class="addthis_toolbox addthis_pill_combo" addthis:url="http://www.foo.com/foo">

而且,如果我删除了其中一个,其他的也会出现。

问题是,我只关心XML文件中的一部分-我不需要解析整个文件。我只需要它在一个XElement中,这样我就可以找到它的那一部分。有没有办法规避解析错误?而且我需要一个通用的解决方案-我想解析文件,而不管任何未声明的前缀错误。

谢谢

2个回答

12

这个 XML 不是有效的。

如果要使用命名空间前缀(如addthis:),必须声明命名空间,方法是编写xmlns:addthis="some URI"

一般来说,不应使用 XML 解析器解析 HTML,因为 HTML 可能不是有效的 XML。由于这个原因以及其他一些原因(未声明的实体、未转义的 JS、未封闭的标签),不建议使用 XML 解析器解析 HTML。
而是使用HTML Agility Pack


当然,你是对的,我觉得自己有点傻问这个问题。谢谢你提供的链接,看起来正是我需要的。 - Pieter Müller

7
如果你需要完全使用代码实现,你需要像这样做:
    XmlReaderSettings settings = new XmlReaderSettings { NameTable = new NameTable() };
    XmlNamespaceManager xmlns = new XmlNamespaceManager(settings.NameTable);
    xmlns.AddNamespace("addthis", "");
    XmlParserContext context = new XmlParserContext(null, xmlns, "", XmlSpace.Default);
    XmlReader reader = XmlReader.Create(new StringReader(text), settings, context);
    xmlDoc.Load(reader);

对于任何其他前缀,请添加更多:

    xmlns.AddNamespace("prefix", "");

1
真希望xmlDoc的声明被显示出来。我会假设你正在使用XDocument。 - Scott Fraley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接