如何使用Perl';忽略一个糟糕的xmlns名称空间;什么是LibXML?

如何使用Perl';忽略一个糟糕的xmlns名称空间;什么是LibXML?,xml,perl,namespaces,xml-namespaces,libxml2,Xml,Perl,Namespaces,Xml Namespaces,Libxml2,我有一个XML文档引用了一个不可用的命名空间: <microplateDoc xmlns="http://moleculardevices.com/microplateML"> ...my data is here... </microplateDoc> …我的数据在这里。。。 我有一个脚本,读起来很好,但只有当我删除上面的两个标记时,它才会读出来,否则它会读得一团糟。忽略它可以吗?我正在考虑编写另一个脚本来遍历我所有的输入文件并删除这两行,但我认为有更好的方法吗

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

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

…我的数据在这里。。。
我有一个脚本,读起来很好,但只有当我删除上面的两个标记时,它才会读出来,否则它会读得一团糟。忽略它可以吗?我正在考虑编写另一个脚本来遍历我所有的输入文件并删除这两行,但我认为有更好的方法吗


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

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

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

<microplateDoc xmlns="http://moleculardevices.com/microplateML">
...my data is here...
</microplateDoc>
我怀疑您对什么是XML名称空间感到困惑。名称空间是一个,也就是说一个符合RFC3305的字符串。它(不一定)是一个统一的资源定位器,尽管它可以是,因为URL都是URI

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

当你说读取这个XML文档的脚本“读得一团糟”时,你不可能说出你的意思。忽略它可以吗?很可能是这样。毕竟,名称空间的部分目的是使在XML文档中嵌入某些文档使用者可以忽略的信息成为可能


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

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


看起来是个有用的例子。我通常不使用Perl,但我在其他一些语言中也看到过这种情况。

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

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


这将删除以xmlns=”“

开头的所有内容。您可以使用类似于
/*[name()=“microplateDoc”]
的XPath搜索节点。希望这能奏效。
谢谢。

谢谢您的链接,如果有办法告诉解析器忽略它,我仍然很想听听其他人的意见。这将比删除它更容易。我的xml fu目前很差,所以这里的其他人恐怕都会对你不利:)也许你可以发布代码的相关部分。这肯定会有帮助。正如罗伯特·罗斯尼(Robert Rossney)在下面所说的那样——不可能知道你的描述有什么问题。这是一个完全有效的名称空间声明,因此这里可能会发生其他情况。感谢所有人提供的帮助,下面的问题已解决。非常感谢,您是正确的,我未能注册名称空间。我错误地认为名称空间是位于特定地址的变量名列表。我从您指向的网站添加了这两行代码:my$xpc=XML::LibXML::XPathContext->new($tree)$xpc->registerNs(microplateML=>');现在我可以用这样的方式访问元素:foreach my$camelid($xpc->findnodes('//microplateML:species'){它仍然不能100%工作,但这就是问题所在,毕竟不需要删除该行。再次感谢。