我正在提取网站的源代码。然后我想提取其中的特定部分。我的目的是使用 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 无效。
为了使用命名空间前缀(例如
addthis:
),必须通过编写 xmlns:addthis="some URI"
来声明命名空间。
一般来说,您不应该使用 XML 解析器来解析 HTML,因为由于这个原因和许多其他原因(未声明的实体、未转义的 JS、未封闭的标签),HTML 很可能是无效的 XML。
相反,请使用 HTML Agility Pack。
如果您需要在代码中完成所有操作,那么您想要的是这样的:
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", "");