【问题标题】:How to import an XML schema into the "no namespace"如何将 XML 模式导入“无命名空间”
【发布时间】:2010-08-23 18:19:58
【问题描述】:

我在这里有一个架构,我试图在其中包含/导入另一个没有命名空间的架构(这无法更改,因为它来自另一个供应商并且不再验证他们的 XML)。这是第一个 Schema:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:samp="http://sample/namespace" 
targetNamespace="http://sample/namespace" 
elementFormDefault="unqualified" attributeFormDefault="unqualified"
xmlns:otr1="http://sample/import/namespace1" 
xmlns:otr2="http://sample/import/namespace2">

<xs:import namespace="http://sample/import/namespace1" schemaLocation="other1.xsd" />
<xs:import namespace="http://sample/import/namespace2" schemaLocation="other2.xsd"  />
<!-- This one below is having problems, it is valid XML, and I am able to use it
but I am not meeting the actual requirments I have (explained later) -->
<xs:include schemaLocation=="NO_NAME_SPACE_PROBLEM.xsd"/>

...
<xs:element ref="some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA"/>
...


</xs:schema>

还有“NO_NAME_SPACE_SHEMA_PROBLEM.xsd”可以在一定程度上改变,但不能有命名空间。

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     elementFormDefault="unqualified" attributeFormDefault="unqualified">

 <xsd:element name="some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA" 
    type="xsd:string" nillable="true"/>

</xs:schema>

问题是some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA 被放入samp 命名空间。因此,当我尝试将其编组为 XML 时,它会打印出 &lt;samp:some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA&gt;&lt;child-elem/&gt;&lt;/samp:some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA&gt;,这是一个大问题,因为 XML 不会验证,因为它不应该拥有。所以我的目标是简单地将元素导入无命名空间命名空间。

更新 1:对不起,我曾经并且正在使用 xs:include,而不是 xs:import 用于无命名空间架构。问题语法已更新。我还使用 JiBX 代码生成来生成域对象和用于编组的 JiBX 绑定。所以它也必须兼容 JiBX。

更新 2:根据 skaffman 的回答,我现在将使用 xs:import。我想我将把它扩展到一个新问题。

【问题讨论】:

  • 您需要非常清楚importinclude 之间的区别,它们做的事情截然不同。
  • 是的,很抱歉,我本来想早点说的,但还没等我回到键盘上就被阻止了。

标签: xml xsd marshalling jibx


【解决方案1】:

你试过了吗

<xs:import namespace="" schemaLocation="NO_NAME_SPACE_PROBLEM.xsd"/>

有趣的是,XML Schema 规范 strongly suggests

<xs:import schemaLocation="NO_NAME_SPACE_PROBLEM.xsd"/>

应该将NO_NAME_SPACE_PROBLEM.xsd 导入“无命名空间”。如果您的环境将其导入到封闭架构文档的命名空间中,那么我很确定这是您平台中的一个错误。


更新:好的,您的更新表明您正在尝试使用&lt;xs:include&gt; 来引用不同命名空间中的类型。您不能这样做 - &lt;xs:include&gt; 总是 将包含的项目带入与父模式文档相同的命名空间。如果它们用于不同的命名空间,则必须使用 &lt;xs:import&gt;

如果您想引用导入的无命名空间架构中的元素定义之一,那么您需要找到一种为“无命名空间”命名空间分配前缀的方法。如果它有前缀,你可以这样引用它们:

<xs:element ref="nn:some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA"/>

尝试将属性xmlns:nn="" 添加到父架构文档中,看看是否可行。

【讨论】:

  • @skaffman:我已经更新了我的答案,很抱歉造成混淆。我也试过&lt;xs:import namespace="" schemaLocation="NO_NAME_SPACE_PROBLEM.xsd"/&gt;,但现在&lt;xs:element ref="some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA"/&gt; 无法解析元素引用。
  • @skaffman:非常感谢您更新的答案。我现在正在研究这个方向。我现在只是遇到 JiBX 问题,也许我会将其分支到一个新问题中。
  • @skaffman:添加xmlns:="" 导致错误:无法将空字符串添加到非默认命名空间。
  • @Zombies: 不是xmlns:="", xmlns:nn=""
  • @skaffmann xmlns:nn="" 会导致错误,因为它违反了 W3C 命名空间规范。 No prefix undeclaring
猜你喜欢
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多