当前位置:  开发笔记 > Android > 正文

什么是XML命名空间?

如何解决《什么是XML命名空间?》经验,为你挑选了6个好方法。

我总是觉得有点难以向其他人解释:为什么存在XML命名空间?我们什么时候应该使用它们,何时不应该使用它们 在XML中使用命名空间时常见的陷阱是什么?

另外,它们如何与XML模式相关?XSD架构是否应始终与命名空间相关联?



1> Steve Jessop..:

它们允许组合多种标记语言,而不必担心元素和属性名称的冲突.

例如,查看任何一点XSLT代码,然后想想如果你没有使用命名空间并尝试编写一个XSLT,输出必须包含"template","for-each"等元素,会发生什么? .语法错误,是什么.

我会把建议和陷阱留给比我更有经验的人.


我说的是XML命名空间根本不是解决方案。该设备只能“解决”一些用例,但绝不能解决所有用例,而且要以排除一般解决方案为代价-实际上存在,并且甚至在这种愚蠢见识之前就已经存在。而且,顺便说一句,最初它们是“用来”标记出处的,但是当有人指出这已经是一个已解决的问题时,支持者便开始四处移动球门柱,并一直坚持下去,直到批评家们[找到更好的解决方案。他们的时间](http://lists.xml.org/archives/xml-dev/200305/msg00344.html)。
@ arayq2,......呃?使用类似"角色"属性的东西只有在每个人都同意的情况下才有用.查看我在生产中使用XML命名空间的好处(例如,将模板规则混合到SVG模板中,命名空间用于描述Inkscape域中的内容,属于模板引擎的内容等),I很难同意,如果没有像标准一样的惯例,那么在没有彼此了解的情况下设计的软件解决方案之间的这种级别的互操作性是可能的.

2> arayq2..:

为什么存在XML命名空间?

因为,早在1997年,W3C中一些非常有影响力的人想要他们,并且不会拒绝答案.即使有证据表明,我敢肯定地说,有更好的方法来解决他们认为存在的"问题",他们仍然挥舞着他们的影响力,将他们的愿望写入W3C建议书.

围绕XML命名空间的现在广泛的神话中最大的一点就是它们具有技术优势.(这是一个简单存在的建议书的下游效应,因而占据了思想空间 - "哎呀,必须有一个(好的)理由!" - 而不是某个地方的可忘记的脚注.)

很痛苦,没有收获.

我们什么时候应该使用它们,何时不应该使用它们

如果你能提供帮助,你绝不应该使用它们.不幸的是,感兴趣的各方不断推广这款BAD [*]设备已经促成了今天的一系列规范,这使得几乎不可能不必在某些时候与XML命名空间竞争.因此,即使您自己避开了XML命名空间,您也会发现来自各个方向的命名空间镶嵌的crud,或者更糟糕的是,除非您提供这样的crud,否则它们只会拒绝工作.

在XML中使用命名空间时常见的陷阱是什么?

一个非常常见的缺陷是将Xpath表达式与名称空间被"默认"的文档一起使用:名称空间必须在表达式中显式化.另一个问题是在构建文档时"正确"使用它们:它们凭空创造问题.

另外,它们如何与XML模式相关?XSD架构是否应始终与命名空间相关联?

没有必要的关系,除了XSD Schema规范是在委员会中几乎每个人都有XML命名空间的时候开发的.所以他们尽可能深入地工作.尽管如此,使用没有命名空间的XSD架构是可能的,但这是一个陡峭的艰难过程,因为几乎每个支持XSD架构的工具集都假设您"想要"使用命名空间.

[*] BAD =设计破碎

更新:一篇关于这个非解决方案的老问题.


@ arayq2你的答案中有90%只是对你所遇到的一些个人问题进行了研究,这些问题导致了名称空间被包含在内.我不喜欢命名空间,也不喜欢W3C的任何人都在抱怨,但StackOverflow上的答案不是你在这个问题上表达个人感受的地方.保持实际参数不使用*使用*名称空间,丢失30种不同的方式,你只说"我认为命名空间是垃圾",以及与愤怒的文章关于近20年的战斗的链接.

3> gizmo..:

它与询问"为什么我们使用Java/C#包?"几乎相同:

可重用性:您可以重用一组您在不同类型的xml文档中定义的标记/属性.

模块化:如果需要在XML中添加一些"方面"; 向xml文档添加命名空间比更改整个xml架构定义更简单.

避免使用"主"命名空间:您不要强制解析器使用大型模式定义,只需使用您需要的命名空间即可.



4> stephbu..:

最大的陷阱IMHO是人工交互解释文档,例如开发代码来处理XML Doc.很容易关注文档的文字表达而不是解析文档的信息集结果.

例如以下节点




在语义上都是相同的 - 但与天真的眼睛非常不同.

第一个例子产生了一个非常常见的错误,即开发XPath - 错过了"a"在命名空间中的事实 - 因此//产生的不匹配.(或者更糟糕的是仍然匹配不同命名空间中的节点!)

第三个例子打开了另一个理解缺陷 - 前缀文本在语义上很重要.使用XPATH解析文档时,我可以声明任何我喜欢的匹配前缀,只要它与文档的uri匹配即可.



5> Jim..:

将它们视为元素类型的姓氏.如果你有两个朋友,都叫Bob,而你正在谈论其中一个,有人可能会问你在谈论哪个Bob.只说"鲍勃"不是很有帮助,所以你说"鲍勃史密斯"或"鲍勃琼斯".

元素类型也是如此.有时短名称是不够的,因为不同的人可以选择相同的名称.因此,您将URI包含为"姓",以区分不同的Bobs.



6> Yuval..:

XML是一种超级语言,这意味着它是任何基于XML的语言的基础(有道理,对吧?).将XML视为可以用任何语言编写任何句子的笔.这一切都取决于作者,最好是读者应该知道语言.

XML 命名空间基本上是语言的名称,很像"英语"或"עברית".我帮助XML文档的接收者解析它并提取其中的信息.

假设我有一家家具厂,你有一家家具店.您的存储应用程序和我的供应应用程序是完全无关的,但是当它们通过XML消息进行通信时,消息应该是可以理解的并且可以被双方轻松解析

因此,两个系统都需要知道Schema,它定义了语言语法和约定的限制.将模式视为字典和语法教科书.模式是两个系统都应该知道的文档,每个系统中编写解析代码的人都必须知道,并且包括命名空间的声明.

每个命名空间都被命名为URI,在大多数情况下,它是定义它的模式文档的位置.

当然,并非每个XML文档都需要命名空间,尤其是当它不用于将信息传递给远程系统时.例如,将对象序列化为XML以便在数据库中持久化时.

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有