2

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

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

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

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

4

5 回答 5

4

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

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

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

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

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

于 2010-01-04T08:28:14.823 回答
2

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

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

于 2010-01-05T02:07:47.890 回答
1

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

于 2010-01-04T07:13:36.457 回答
1

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

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

这应该删除以 xmlns="" 开头的所有内容

于 2013-09-12T15:16:14.230 回答
0

您可以使用 XPath 搜索节点,例如//*[name()="microplateDoc"]. 希望这有效。谢谢。

于 2014-11-08T07:11:25.757 回答