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

时间:2011-09-26 15:29:22

标签: xml xelement

我正在拉动网站的来源。然后我想提取它的一个特定部分。我的目的是使用LINQ-to-XML来做到这一点。

但是,当我解析源代码时出现错误:

XElement source = XElement.Load(reader);

问题似乎是对我没有的命名空间的引用。由于此行,我收到错误:'addthis' is an undeclared prefix. Line 130, position 51.

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

如果我删除那个,则会发生其他情况。

事情,我只关心这个XML文件的一部分 - 我不需要能够解析整个文件。我只是想在一个XElement中,所以我可以找到它的一部分。有没有办法解决解析错误?我需要一个通用的解决方案 - 我想解析文件而不管任何undeclared prefix错误。

由于

2 个答案:

答案 0 :(得分:7)

此XML无效。

为了使用名称空间前缀(例如addthis:),必须通过编写xmlns:addthis="some URI"来声明名称空间。

通常,您不应该使用XML解析器解析HTML,因为HTML可能是无效的XML,原因还有其他一些原因(未声明的实体,未转义的JS,未关闭的标记)。 相反,请使用HTML Agility Pack

答案 1 :(得分:2)

如果您需要在代码中完成所有操作,那么您想要的是这样的东西:

    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", "");