如何使用Perl的LibXML忽略错误的xmlns命名空间?

时间:2010-01-04 06:44:33

标签: xml perl namespaces xml-namespaces libxml2

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

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

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

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

5 个答案:

答案 0 :(得分:3)

  

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

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

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

当你说阅读这个XML文档的脚本“全部搞砸了”时,你不可能说出你的意思。可以忽略它吗?它很可能是。毕竟,名称空间的部分目的是使信息嵌入XML文档中,该文档的某些使用者可以忽略这些信息。

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

答案 1 :(得分:2)

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

http://perl-xml.sourceforge.net/faq/#namespaces_xpath看起来像一个有用的例子。我一般不和Perl合作,但我发现这种情况发生在其他一些语言中。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

这应该删除以xmlns =“”

开头的所有内容

答案 4 :(得分:0)

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