elementFormDefault在XSD中做了什么?

Lev*_*evi 81 xml xsd xml-namespaces xml-validation xsd-validation

elementFormDefault什么,什么时候应该使用?

所以我找到了一些elementFormDefault值的定义:

qualified - 元素和属性位于架构的targetNamespace中

不合格 - 元素和属性没有命名空间

因此,根据该定义,我认为如果将模式设置为限定,那么为什么必须在类型前加上命名空间?那些你甚至有一套不合格的场景是什么?我尝试使用谷歌搜索,但我得到的只是一些非常难以理解的W3C页面.

这是我现在正在使用的文件,为什么我需要声明类型,target:TypeAssignments因为我声明它targetNamespace是同一个xmlns:target

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:target="http://www.levijackson.net/web340/ns"
        targetNamespace="http://www.levijackson.net/web340/ns" 
        elementFormDefault="qualified">
  <element name="assignments">
    <complexType>
      <sequence>
        <element name="assignments" type="target:TypeAssignments"
                 minOccurs="1" maxOccurs="unbounded"/>
      </sequence>
    </complexType>
  </element>
  <complexType name="TypeAssignments">
    <sequence>
      <element name="assignment" type="target:assignmentInfo"
               minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
  </complexType>
  <complexType name="assignmentInfo">
    <sequence>
      <element name="name" type="string"/>
      <element name="page" type="target:TypePage"/>
      <element name="file" type="target:TypeFile" 
               minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
    <attribute name="id" type="string" use="required"/>
  </complexType>
  <simpleType name="TypePage">
    <restriction base="integer">
      <minInclusive value="50" />
      <maxInclusive value="498" />
    </restriction>
  </simpleType>
  <simpleType name="TypeFile">
    <restriction base="string">
      <enumeration value=".xml" />
      <enumeration value=".dtd" />
      <enumeration value=".xsd" />
    </restriction>
  </simpleType>
</schema>
Run Code Online (Sandbox Code Playgroud)

Alo*_*hci 68

ElementFormDefault与模式中类型的名称空间无关,它与XML文档中符合模式的元素的名称空间有关.

这是规范的相关部分:

Element Declaration Schema

Component Property  {target namespace}
Representation      If form is present and its ·actual value· is qualified, 
                    or if form is absent and the ·actual value· of 
                    elementFormDefault on the <schema> ancestor is qualified, 
                    then the ·actual value· of the targetNamespace [attribute]
                    of the parent <schema> element information item, or 
                    ·absent· if there is none, otherwise ·absent·.
Run Code Online (Sandbox Code Playgroud)

这意味着您在模式顶部声明的targetNamespace仅适用于符合模式的XML文档中的元素,如果elementFormDefault是"qualified"或者在模式中显式声明元素具有form ="qualified" .

例如:如果elementFormDefault不合格 -

<element name="name" type="string" form="qualified"></element>
<element name="page" type="target:TypePage"></element>
Run Code Online (Sandbox Code Playgroud)

将expect"name"元素放在targetNamespace中,将"page"元素放在null命名空间中.

为了节省你必须在每个元素声明上放置form ="qualified",说明elementFormDefault ="qualified"意味着targetNamespace应用于每个元素,除非通过在元素声明上放置form ="unqualified"来覆盖.


小智 56

考虑元素AuthorType使用的以下ComplexTypeauthor

<xsd:complexType name="AuthorType">
  <!-- compositor goes here -->
  <xsd:sequence>
     <xsd:element name="name" type="xsd:string"/>
     <xsd:element name="phone" type="tns:Phone"/>
  </xsd:sequence>
  <xsd:attribute name="id" type="tns:AuthorId"/>
</xsd:complexType>
<xsd:element name="author" type="tns:AuthorType"/>
Run Code Online (Sandbox Code Playgroud)

如果 elementFormDefault="unqualified"

然后遵循XML实例是有效的

<x:author xmlns:x="http://example.org/publishing">
   <name>Aaron Skonnard</name>
   <phone>(801)390-4552</phone>
</x:author>
Run Code Online (Sandbox Code Playgroud)

允许作者的name属性而不指定名称空间(不合格).作为其一部分的任何元素都<xsd:complexType>被视为complexType的本地元素.

如果 elementFormDefault="qualified"

那么实例应该具有限定的本地元素

<x:author xmlns:x="http://example.org/publishing">
   <x:name>Aaron Skonnard</name>
   <x:phone>(801)390-4552</phone>
</x:author>
Run Code Online (Sandbox Code Playgroud)

请参阅链接了解更多详情


kjh*_*hes 42

一个旧的,经常被问到的问题的新的,详细的答案和解释......

简短的回答:如果你不添加elementFormDefault="qualified"xsd:schema,那么默认unqualified值意味着局部声明的元素在没有命名空间.

关于什么elementFormDefault做了很多混淆,但这可以通过一个简短的例子快速澄清......

简化版的XSD:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:target="http://www.levijackson.net/web340/ns"
        targetNamespace="http://www.levijackson.net/web340/ns">
  <element name="assignments">
    <complexType>
      <sequence>
        <element name="assignment" type="target:assignmentInfo" 
                 minOccurs="1" maxOccurs="unbounded"/>
      </sequence>
    </complexType>
  </element>
  <complexType name="assignmentInfo">
    <sequence>
      <element name="name" type="string"/>
    </sequence>
    <attribute name="id" type="string" use="required"/>
  </complexType>
</schema>
Run Code Online (Sandbox Code Playgroud)

关键点:

  • assignment元件在本地定义.
  • 默认情况下,XSD中本地定义的元素不在命名空间中.
    • 这是因为默认值elementFormDefaultunqualified.
    • 这可能是XSD创作者的设计错误.
    • 标准做法是始终使用,elementFormDefault="qualified" 以便assignment在目标命名空间中使用.

看似有效的XML

根据上面的XSD,这个XML看起来应该是有效的:

<assignments xmlns="http://www.levijackson.net/web340/ns"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.levijackson.net/web340/ns try.xsd">
  <assignment id="a1">
    <name>John</name>
  </assignment>
</assignments>
Run Code Online (Sandbox Code Playgroud)

注意:

  • 在默认的命名空间assignments的地方assignments在默认的命名空间,所有后代(http://www.levijackson.net/web340/ns).

困惑的验证错误

尽管看起来有效,但上面的XML会产生以下令人困惑的验证错误:

[错误] try.xml:4:23:cvc-complex-type.2.4.a:从元素'赋值'开始发现无效内容.预计会有一个'{assignment}'.

笔记:

  • 你不会是第一个诅咒这种诊断的开发人员,似乎说内容是无效的,因为它希望找到一个assignment元素,但它实际上找到了一个assignment元素. (WTF)
  • 这真正意味着什么:{}周围assignment意味着验证assignment 这里没有命名空间.不幸的是,当它说它找到了一个assignment元素时,它没有提到它在默认命名空间中发现它与没有命名空间不同.

  • 绝大多数时候:添加elementFormDefault="qualified"xsd:schemaXSD 的元素.这意味着有效的XML必须在XSD中本地声明时将元素放在目标命名空间中; 否则,有效的XML必须将本地声明的元素放在无命名空间中.
  • 少数时间:更改XML以符合XSD的assignment无命名空间要求.例如,这可以通过添加xmlns=""assignment元件来实现.

  • 虽然这不是OP问题,但它*是OP所要求的,并且非常有用并且很好地解释了.我认为这应该得到更多的可见度投票,以帮助那些寻求理解`elementFormDefault`的人 (5认同)
  • “[元素] 周围的 { 和 }”...啊!这就是我现在找到解决方案的原因,我已经挣扎了一个小时了!谢谢! (2认同)

ste*_*n f 12

要注意的是elementFormDefault的重要之处在于它适用于本地定义的元素,通常是complexType块中的命名元素,而不是在架构的顶层定义的全局元素.使用elementFormDefault ="qualified",您可以使用模式的目标名称空间作为文档的默认名称空间,在xml文档中处理模式中的本地元素.

实际上,使用elementFormDefault ="qualified"能够在嵌套块中声明元素,否则你必须在顶层声明所有元素并使用ref属性在嵌套元素中的模式中引用它们,从而产生一个更紧凑的架构.

XML Schema Primer中的这一部分讨论了它:http://www.w3.org/TR/xmlschema-0/#NS


Fer*_*eri 5

elementFormDefault ="qualified"用于控制XML实例文档(.xml文件)中名称空间的使用,而不是模式文档本身(.xsd文件)中的名称空间.

通过指定elementFormDefault ="qualified",我们强制使用名称空间声明,以便在使用此模式验证的文档中使用.

通常的做法是指定此值以声明元素应该是合格的而不是不合格的.但是,由于attributeFormDefault ="unqualified"是默认值,因此如果不希望限定命名空间,则不需要在架构文档中指定它.