2010-01-04 76 views
2

我有引用命名空间是没有可用的XML文档:我有一个脚本读取它很好,但只有当我删除了上述两个标签,否则它读取这一切搞砸了如何用Perl的LibXML忽略不良的xmlns命名空间?

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

。忽略它可以吗?我正在考虑编写另一个脚本来检查我的所有输入文件并删除这两行,但我认为可能有更好的方法?

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

+0

也许你可以发布你的代码的相关部分。它肯定会有所帮助。正如罗伯特罗斯尼所说的那样 - 不可能说出你的描述有什么问题。这是一个完全有效的命名空间声明,所以其他事情可能会在这里发生。 – 2010-01-04 09:40:21

+0

感谢所有提供的帮助,下面解决了问题。 – John 2010-01-10 23:13:55

回答

1

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

http://perl-xml.sourceforge.net/faq/#namespaces_xpath看起来像一个有用的例子。我通常不使用Perl,但我已经看到这发生在一堆其他语言中。

+0

非常感谢,你是正确的,我未能注册的名称空间。我错误地认为命名空间是位于特定地址的变量名称列表。 我将这两行从您指出的网站: 我的$ XPC = XML ::的libxml :: XPathContext->新($树); $ xpc-> registerNs(microplateML => 'http://moleculardevices.com/microplateML');现在我可以访问像这样的元素: foreach我的$ camelid($ xpc-> findnodes('// microplateML:species')){ 它仍然不能100%工作,但是这是问题,不是毕竟需要删除该行。再次感谢。 – John 2010-01-10 23:13:14

1

关于从文件中删除行,今天早些时候提出了this exact question。 (只需添加-d到SED选项删除匹配的行。)

+0

感谢您的链接以太网,我仍然渴望听到别人的意见,如果有办法告诉解析器忽略它。这比删除它更容易。 – John 2010-01-04 07:46:57

+0

我的XML-FU是目前差,所以你在其他人的摆布这里恐怕:) – Ether 2010-01-05 01:53:36

3

我有引用命名空间的XML文档没有可用的:

我怀疑你无所适从一个XML命名空间是。命名空间是Uniform Resource Identifier,也就是说符合RFC 3305的字符串。它不是(必然)是统一资源定位器,尽管它可以是,因为URL都是URI。

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

当你说读取这个XML文档的脚本“读取它全部搞砸了”时,不可能说出你的意思。忽略它可以吗?它可能很好。毕竟,命名空间的目的之一就是能够将信息嵌入XML文档中,该文档的某些使用者可以忽略它们。另一方面,如果你不是唯一使用这些文件的人,那么你可能会通过删除别人需要的数据而给自己造成很大的麻烦。

1

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

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

这应该删除一切开始的xmlns =“”

0

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