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

问题描述 投票:0回答:2

我正在提取网站的源代码。然后我想提取其中的特定部分。我的目的是使用 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
错误。

谢谢

xml xelement
2个回答
11
投票

此 XML 无效。

为了使用命名空间前缀(例如

addthis:
),必须通过编写
xmlns:addthis="some URI"
来声明命名空间。

一般来说,您不应该使用 XML 解析器来解析 HTML,因为由于这个原因和许多其他原因(未声明的实体、未转义的 JS、未封闭的标签),HTML 很可能是无效的 XML。
相反,请使用 HTML Agility Pack


5
投票

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

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);
XDocument xmlDoc = XDocument.Load(reader);

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

xmlns.AddNamespace("prefix", "");
© www.soinside.com 2019 - 2024. All rights reserved.