【问题标题】:How can I ignore a bad xmlns namespace with Perl's LibXML?如何使用 Perl 的 LibXML 忽略错误的 xmlns 命名空间?
【发布时间】:2011-01-01 03:45:35
【问题描述】:

我有一个引用不可用命名空间的 XML 文档:

<microplateDoc xmlns="http://moleculardevices.com/microplateML">
...my data is here...
</microplateDoc>

我有一个脚本可以很好地读取它,但只有当我删除上面的两个标签时,否则它会全部搞砸。可以忽略它吗?我正在考虑编写另一个脚本来遍历我的所有输入文件并删除这两行,但我认为可能有更好的方法?

如果我确实检查了所有数据文件并删除了这两行,那么使用脚本执行此操作的最佳方法是什么?我想只是打开每个文件,搜索这些术语,删除它们,保存文件,你能想到更好的方法吗?谢谢。

【问题讨论】:

  • 也许您可以发布代码的相关部分。这肯定会有所帮助。正如罗伯特·罗斯尼(Robert Rossney)在下面所说的那样-您的描述无法说出问题所在。这是一个完全有效的命名空间声明,所以这里可能会发生其他事情。
  • 感谢大家的帮助,问题已解决。

标签: xml perl namespaces xml-namespaces libxml2


【解决方案1】:

您可以使用像//*[name()="microplateDoc"] 这样的XPath 搜索节点。希望这有效。 谢谢。

【讨论】:

    【解决方案2】:

    所以你的意思是当命名空间没有在 xml 文档中正确添加前缀时,XML::LibXML 模块没有正确解析你的 xml 文件/内容?一种解决方法是动态删除命名空间。您可以执行以下操作:

    $xml =~ s/xmlns\=([\S]+)//m;

    这应该删除以 xmlns=""

    开头的所有内容

    【讨论】:

      【解决方案3】:

      我认为您的命名空间没有任何问题,除非您确信不会有任何不受欢迎的副作用,否则我不会弄乱输入文件。我认为它发生的是一个常见的初学者 XML 处理错误:需要在代码中注册命名空间(即绑定到前缀),然后才能访问该命名空间中的节点。

      http://perl-xml.sourceforge.net/faq/#namespaces_xpath 看起来是一个有用的例子。我通常不使用 Perl,但我在许多其他语言中看到过这种情况。

      【讨论】:

      • 非常感谢,您是对的,我未能注册名称空间。我错误地认为命名空间是位于特定地址的变量名列表。我从您指向的网站中添加了这两行:my $xpc = XML::LibXML::XPathContext->new($tree); $xpc->registerNs(microplateML => 'moleculardevices.com/microplateML');现在我可以通过以下方式访问元素: foreach my $camelid ($xpc->findnodes('//microplateML:species')) { 它仍然不能 100% 工作,但这是问题所在,无需删除该行毕竟。再次感谢。
      【解决方案4】:

      我有一个引用不可用命名空间的 XML 文档:

      我怀疑您对 XML 命名空间是什么感到困惑。命名空间是Uniform Resource Identifier,也就是说符合 RFC 3305 的字符串。它不是(必然)统一资源Locator,尽管它可以是,因为 URL 都是 URI。

      重要的是:仅仅因为 XML 命名空间以 http:// 开头并不意味着 XML 解析器会查找它。它不会(除非编写它的人不了解命名空间是什么,在这种情况下,您将遇到比这更多的问题)。

      当您说读取此 XML 文档的脚本“读到一切都搞砸了”时,您无法说出您的意思。可以忽略它吗?很可能是这样。毕竟,命名空间的部分目的是使在 XML 文档中嵌入某些用户可以忽略的信息成为可能。

      另一方面,如果您不是唯一使用这些文件的人,您可能会因为删除其他人需要的数据而给自己带来很大的麻烦。

      【讨论】:

        【解决方案5】:

        关于从文件中删除行,this exact question 今天早些时候被问到。 (只需在 sed 选项中添加 -d 即可删除匹配的行。)

        【讨论】:

        • 感谢 Ether 的链接,如果有办法告诉解析器忽略它,我仍然很想听听其他人的意见。这将比删除它更容易。
        • 我的 xml-fu 目前很穷,所以恐怕你在这里受其他人的摆布 :)
        猜你喜欢
        • 1970-01-01
        • 2014-01-25
        • 2011-05-25
        • 1970-01-01
        • 2011-12-05
        • 2015-02-18
        • 1970-01-01
        • 1970-01-01
        • 2015-05-01
        相关资源
        最近更新 更多