如何将 XML 模式导入到“无命名空间”环境中

发布于 2024-09-15 19:41:41 字数 1891 浏览 8 评论 0原文

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

<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 时,它会打印出 这是一个大问题,因为 XML 不会验证,因为它本来就不应该验证。所以我的目标是简单地将元素导入到无命名空间命名空间中。

更新 1:抱歉造成混淆,我过去和现在都在使用 xs:include,而不是 xs:import 来处理无命名空间架构。问题语法已更新。我还使用 JiBX codegen 生成域对象和用于编组的 JiBX 绑定。所以它也必须兼容 JiBX。

更新 2:根据 skaffman 的回答,我现在将使用 xs:import。我想我会把这个问题分成一个新问题。

I have a schema here where I am trying to include/import another schema that has no namespace (and this cannot be changed because it comes from another vendor and it would no longer validate their XML). Here is the first 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>

And the "NO_NAME_SPACE_SHEMA_PROBLEM.xsd" which can be changed to some extent, but it cannot have namespace.

<?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>

The problem is that the some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA is being put into the samp namespace. So when I try to marshall this to XML it prints out <samp:some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA><child-elem/></samp:some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA> which is a big problem because that XML will not validate since it isn't meant to have. So my goal is to simply import elements into the no-namespace namespace.

Update 1: Sorry for the confusion, I was and am using xs:include, not xs:import for the no-namespace schema. Question syntax has been updated. I am also using JiBX codegen to generate domain objects and JiBX binding for marshalling. So it it must be JiBX compatible too.

Update 2: As per skaffman's answer, I will now be using xs:import. I think I will be branching this into a new question.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

奢望 2024-09-22 19:41:41

您尝试过吗

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

?有趣的是,XML Schema 规范强烈建议

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

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


更新:好的,您的更新表明您正在尝试使用 来引用不同命名空间中的类型。您不能执行此操作 - 始终 将包含的项目带入与父架构文档相同的命名空间中。如果它们用于不同的命名空间,则必须使用

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

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

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

Have you tried

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

Interesting, the XML Schema spec strongly suggests that

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

should import NO_NAME_SPACE_PROBLEM.xsd into the "no namespace". If your environment is instead importing it into the enclosing schema document's namespace, then I'm pretty sure that's a bug in your platform.


update: OK, your update says you're trying to use <xs:include> to refer to types in a different namespace. You can't do this - <xs:include> always brings the included items into the same namespace as the parent schema document. If they're for a different namespace, you must use <xs:import>.

If you want to refer to one of the element definitions in the imported no-namespace schema, then you need to find a way of assigning a prefix to the "no namespace" namespace. If it had a prefix, you could refer to them like this:

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

Try adding the attribute xmlns:nn="" to the parent schema document, see if that works.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文