XML命名空间和验证

时间:2012-02-21 12:32:46

标签: xsd xml-namespaces

今天我遇到了以下问题。我有以下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以使实例文档有效?

2 个答案:

答案 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>

哪个更好?我认为第二种选择。