【问题标题】:Workaround for "undeclared prefix" error on XElement.Load()XElement.Load() 上“未声明的前缀”错误的解决方法
【发布时间】:2011-09-26 15:29:21
【问题描述】:

我正在提取网站的来源。然后我想提取它的特定部分。我的意图是使用 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


    【解决方案1】:

    此 XML 无效。

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

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

    【讨论】:

    • 你当然是对的,我觉得问起来有点傻。感谢您的链接,这似乎是我需要的。
    【解决方案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", "");
    

    【讨论】:

    • 当然希望显示 xmlDoc 的声明。转到 assume 你正在使用 XDocument。
    猜你喜欢
    • 1970-01-01
    • 2020-08-13
    • 2017-09-11
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 2015-03-26
    • 2013-07-11
    • 1970-01-01
    相关资源
    最近更新 更多