我正在拉动网站的来源。然后我想提取它的一个特定部分。我的目的是使用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
错误。
由于
答案 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", "");