XML Schema:具有仅包含文本的属性的元素?

Posted

技术标签:

【中文标题】XML Schema:具有仅包含文本的属性的元素?【英文标题】:XML Schema: Element with attributes containing only text? 【发布时间】:2010-09-27 10:56:16 【问题描述】:

我很难找到这个。如何在 XML 模式文件中为 XML 定义一个元素,如下所示:

<option value="test">sometext</option>

我不知道如何定义一个类型为xs:string 并且还具有属性的元素。

这是我目前所得到的:

<xs:element name="option">
    <xs:complexType>
        <xs:attribute name="value" type="xs:string" />
    </xs:complexType>
</xs:element>

【问题讨论】:

【参考方案1】:

试试

  <xs:element name="option" type="AttrElement" />

  <xs:complexType name="AttrElement">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="value" type="xs:string">
        </xs:attribute>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

【讨论】:

我在尝试您的代码时遇到以下异常 - org.xml.sax.SAXParseException: src-resolve: 无法将名称“AttrElement”解析为 (n)“类型定义”组件。为什么会这样? 如果是这样,可能是因为您的架构文档有一个目标命名空间,您需要使用前缀名称来指向该类型。 (如果前缀tns 绑定到架构文档的目标命名空间,您将使用type="tns:AttrElement" 来引用类型。) @Ashwin 您可能需要使用类型命名空间引用类型(type="tns:AtrElement" 如果 XSD 的默认命名空间是 xs 而不是文档的 targetNamespace。通常在这种情况下定义 tns并使用。【参考方案2】:

... 或内联等效项:

<xs:element name="option">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="value" type="xs:string" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>

【讨论】:

我发现在complexType 中定义simpleContent 真的很不直观。但话又说回来,它是 XSD,似乎没有什么是真正直观的。还是谢谢! :-) 这将在 IntelliJ (V12.1.3) 中为我显示一个错误:value 属性是“不允许的”。使用 complexContent 而不是 simpleContent 修复了它。 @CrBruno 最好为此打开一个专门的 SO 问题。随意在 cmets 中链接到它(并指向这个讨论)【参考方案3】:

我知道它不一样,但它对我有用:

<xsd:element name="option">
    <xsd:complexType mixed="true">
        <xsd:attribute name="value" use="optional" type="xsd:string"/>
    </xsd:complexType>
</xsd:element>

【讨论】:

以上是关于XML Schema:具有仅包含文本的属性的元素?的主要内容,如果未能解决你的问题,请参考以下文章

XML和Schema命名空间详解

XML_04_XML Schema

如何在XML Schema定义中选择一个且仅一个元素

使用对象类型形成XML数据

如何使生成的类包含 XML Schema 文档中的 Javadoc

XSLT - 如何仅输出属性值并忽略元素的值