XSD anyAttribute 元素

XSD 中的 <xs:anyAttribute> 是属性的“万金油”通配符,作用和 <xs:any> 完全对应,只不过它针对的是属性而不是子元素。

几乎所有支持“任意扩展属性”的场景(XML 配置、SOAP header、XHTML 的 data-*、微格式、自定义框架等)都靠它实现。

基本语法

<xs:anyAttribute
    namespace="##any" | ##other | ##targetNamespace | ##local | 具体命名空间列表
    processContents="lax | skip | strict"   (默认 strict)
/>

属性含义和 <xs:any> 完全一样,只是没有 minOccurs/maxOccurs(因为属性要么出现一次,要么不出现)。

关键属性速查表

属性常用值含义说明
namespace##any允许任意命名空间的任意属性(最宽松)
##other除当前 targetNamespace 外的所有命名空间
##targetNamespace只允许当前 schema 自己的命名空间
##local只允许没有命名空间的属性(如 data-count=”3″)
具体列表如 “http://www.w3.org/2000/xmlns/ http://example.com/ext”
processContentsskip(最常用)完全不验证这些属性是否存在定义,性能最好,推荐给配置类场景
lax能找到定义就验证,找不到也不报错
strict(默认)必须能在 schema 中找到这些属性的定义,否则验证失败

经典真实写法(99% 的项目都用下面这几种)

场景推荐写法(直接复制就行)说明
完全开放配置(Spring、MyBatis、Maven、Log4j2)<xs:anyAttribute namespace="##any" processContents="skip"/>最常见!几乎所有 Java 配置框架都这样写
允许任意 data-、aria- 等 HTML5 属性<xs:anyAttribute namespace="##any" processContents="skip"/>写前端 XML 模板或自定义组件时必备
只允许自己项目扩展属性<xs:anyAttribute namespace="##targetNamespace" processContents="strict"/>安全、可验证,常用于企业内部标准
允许第三方扩展,但尽量验证<xs:anyAttribute namespace="##other" processContents="lax"/>Web Service、SOAP header 常用
只允许无命名空间的扩展属性<xs:anyAttribute namespace="##local" processContents="skip"/>常用于和 JSON 风格一致的配置(如 data-xxx、my-app-xxx)
XHTML5 那种 data-* 属性<xs:anyAttribute namespace="##local" processContents="skip"/> 或者更严谨地正则限制(见下方高级写法)

真实项目中的完整例子

  1. 最经典的 Spring Bean 配置风格
<xs:complexType name="BeanType">
  <xs:sequence>
    <xs:element name="id" type="xs:ID" minOccurs="0"/>
    <xs:element name="class" type="xs:string"/>
    <!-- 其他固定属性... -->
  </xs:sequence>
  <!-- 允许任意属性:lazy-init、scope、autowire、depends-on、自定义属性等 -->
  <xs:anyAttribute namespace="##any" processContents="skip"/>
</xs:complexType>
  1. 自定义组件支持任意 data-* 属性
<xs:complexType name="MyComponent">
  <xs:complexContent>
    <xs:extension base="xs:anyType">
      <xs:attribute name="id" type="xs:ID"/>
      <xs:attribute name="visible" type="xs:boolean" default="true"/>
      <!-- 允许 data-xxx、aria-xxx 等 -->
      <xs:anyAttribute namespace="##any" processContents="skip"/>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>
  1. 只允许自己公司扩展属性(推荐企业内部标准)
<xs:complexType name="Order">
  <xs:sequence> ... </xs:sequence>
  <xs:attribute name="id" type="xs:string" use="required"/>
  <xs:attribute name="status" type="xs:string"/>
  <!-- 只能用我们自己定义的扩展属性,比如 ext:priority、ext:source -->
  <xs:anyAttribute namespace="##targetNamespace" processContents="strict"/>
</xs:complexType>

高级技巧:用正则限制 data-* 属性(非常实用)

虽然 <anyAttribute> 本身不能正则,但可以结合属性声明实现:

<xs:attribute name="data-anything" use="optional">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:pattern value="data-[a-zA-Z0-9\-]+"/>
    </xs:restriction>
  </xs:simpleType>
</xs:attribute>
<xs:anyAttribute namespace="##local" processContents="skip"/> <!-- 兜底 -->

或者更彻底地完全不用 anyAttribute,只用一个通配正则(XSD 1.1 才支持)。

<xs:any> 完全对比表

通配符作用对象出现位置是否有 min/maxOccurs
<xs:any>子元素complexType 的 sequence/choice/all 中
<xs:anyAttribute>属性complexType 的最后(和 attribute 平级)没有

终极记忆口诀(背下来就再也不会写错)

99% 的场景直接写死这句就完事了:

<xs:anyAttribute namespace="##any" processContents="skip"/>

只要你写配置类、可扩展类、插件类、自定义组件,全部甩这行,永远不会错!

有具体的类或 XML 结构想加任意属性支持吗?把片段贴出来,我 10 秒给你最标准的 <anyAttribute> 写法。

文章已创建 2838

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部