今天我遇到了以下问题。我有以下xml:
<c:docschema xmlns:c="http://www.otr.ru/sufd/document/desc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.otr.ru/sufd/document/desc http://otr-sufd/xmlschema/docschema.xsd">
...
</c:docschema>
它正在验证fina对抗它的架构。但我不想在我的xml中使用名称空间前缀,所以我尝试这样写:
<docschema xmlns="http://www.otr.ru/sufd/document/desc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.otr.ru/sufd/document/desc http://otr-sufd/xmlschema/docschema.xsd">
...
</docschema>
它给了我一个验证错误。我正在验证的XSD架构是两个XSD的复合,这里是标题:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
attributeFormDefault="unqualified"
elementFormDefault="unqualified"
xmlns="http://www.otr.ru/sufd/document/desc"
targetNamespace="http://www.otr.ru/sufd/document/desc"
xmlns:fieldset="http://www.otr.ru/sufd/document/fieldset"
xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore">
<xsd:import namespace="http://www.otr.ru/sufd/document/fieldset" schemaLocation="fieldset.xsd"/>
和
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
attributeFormDefault="unqualified"
elementFormDefault="unqualified"
targetNamespace="http://www.otr.ru/sufd/document/fieldset"
xmlns="http://www.otr.ru/sufd/document/fieldset">
那里有什么问题?
编辑:现在的问题是,如何更改我的XSD以使实例文档有效?
答案 0 :(得分:2)
鉴于你所写的内容,我认为问题如下。
让我们考虑你的根元素下面有一个a
元素。
下面的第一个示例有效,因为a
不合格且因为您将elementFormDefault
设置为unqualified
:
第一个例子
<c:docschema xmlns:c="http://www.otr.ru/sufd/document/desc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.otr.ru/sufd/document/desc http://otr-sufd/xmlschema/docschema.xsd">
<a>...</a>
</c:docschema>
在第二个示例中,该文件无效,因为您将elementFormDefault
设置为unqualified
并且您有一个合格的元素a
(在默认命名空间中):
第二个例子
<docschema xmlns="http://www.otr.ru/sufd/document/desc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.otr.ru/sufd/document/desc http://otr-sufd/xmlschema/docschema.xsd">
<a>...</a>
</docschema>
正确的XML可能是:
<docschema xmlns="http://www.otr.ru/sufd/document/desc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.otr.ru/sufd/document/desc http://otr-sufd/xmlschema/docschema.xsd">
<a xmlns="">...</a>
</docschema>
修改强>
如果根元素的子元素在与模式中的根相同的命名空间中定义,则只需将elementFormDefault="unqualified"
更改为elementFormDefault="qualified"
即可拥有验证XML的模式。如果不是这样的话:你肯定必须更深入地重塑你的架构,在这种情况下,也许你应该发布另一个专门用于更多代码的问题(包括更多部分模式和实例)。
答案 1 :(得分:0)
看起来你错误地认为根<docschema>
中的嵌套元素将继承在该根上定义的命名空间。他们不会。
如果要删除名称空间前缀,则必须在实例文档中的每个子节点上显式声明名称空间。
例如
<Root xmlns="http://www.myns.com">
<MyElement1 xmlns="http://www.myns.com">
... etc
</MyElement1>
</Root>
或
<p:Root xmlns:p="http://www.myns.com">
<p:MyElement1>
... etc
</p:MyElement1>
</p:Root>
哪个更好?我认为第二种选择。