我正在拉动网站的来源.然后我想提取它的一个特定部分.我的目的是使用LINQ-to-XML来做到这一点.
但是,当我解析源代码时出现错误:
XElement source = XElement.Load(reader);
Run Code Online (Sandbox Code Playgroud)
问题似乎是对我没有的命名空间的引用.我收到错误:'addthis' is an undeclared prefix. Line 130, position 51.
由于这一行:
<div class="addthis_toolbox addthis_pill_combo" addthis:url="http://www.foo.com/foo">
Run Code Online (Sandbox Code Playgroud)
如果我删除那个,其他的发生.
事实上,我只关心这个XML文件的一部分 - 我不需要能够解析整个文件.我只是想在一个XElement中,所以我可以找到它的一部分.有没有办法解决解析错误?我需要一个通用的解决方案 - 我想解析文件而不管任何undeclared prefix
错误.
谢谢
此XML无效.
为了使用名称空间前缀(例如addthis:
),必须通过编写声明名称空间xmlns:addthis="some URI"
.
通常,您不应该使用XML解析器解析HTML,因为HTML可能是无效的XML,原因还有很多其他原因(未声明的实体,非转义的JS,未关闭的标记).
相反,请使用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);
Run Code Online (Sandbox Code Playgroud)
对于任何其他前缀,请添加更多这些前缀:
xmlns.AddNamespace("prefix", "");
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
16288 次 |
最近记录: |