4. 资源属性的数据模型 (Data Model for Resource Properties)
4. 资源属性的数据模型 (Data Model for Resource Properties)
4.1 资源属性模型 (The Resource Property Model)
属性是描述资源状态的数据片段。属性是关于数据的数据。
在分布式创作环境中使用属性来提供资源的高效发现和管理。例如,'subject'属性可能允许按主题对所有资源进行索引,'author'属性可能允许发现哪些作者编写了哪些文档。
DAV属性模型由名称/值对组成。属性的名称标识属性的语法和语义,并提供引用其语法和语义的地址。
属性有两类:"活"属性和"死"属性。活属性的语法和语义由服务器强制执行。活属性包括以下情况:a)属性的值由服务器保护和维护,b)属性的值由客户端维护,但服务器对提交的值执行语法检查。给定活属性的所有实例必须符合与该属性名称关联的定义。死属性的语法和语义由客户端强制执行;服务器仅逐字记录属性的值。
4.2 属性和HTTP头 (Properties and HTTP Headers)
属性在有限的意义上已经存在于HTTP消息头中。然而,在分布式创作环境中,需要相对大量的属性来描述资源的状态,通过HTTP头设置/返回所有属性是低效的。因此,需要一种机制允许主体识别其感兴趣的一组属性,并仅设置或检索这些属性。
4.3 属性值 (Property Values)
属性的值始终是(格式良好的)XML片段。
选择XML是因为它是一种灵活的、自描述的、结构化的数据格式,支持丰富的模式定义,并且支持多个字符集。XML的自描述性质允许通过添加元素来扩展任何属性的值。客户端在遇到扩展时不会中断,因为它们仍然拥有原始模式中指定的数据,并且必须忽略它们不理解的元素。
XML对多个字符集的支持允许以用户熟悉的字符集对任何人类可读的属性进行编码和读取。XML对多种人类语言的支持(使用"xml:lang"属性)处理了同一字符集被多种人类语言使用的情况。请注意,xml:lang的作用域是递归的,因此包含属性名称元素的任何元素上的xml:lang属性都适用于属性值,除非它已被更局部作用域的属性覆盖。请注意,一个属性只有一种语言的一个值(或可以不定义语言);一个属性不具有不同语言的多个值或多种语言的单个值。
属性始终用由属性名称组成的XML元素表示,称为"属性名称元素"。最简单的例子是空属性,这与不存在的属性不同:
<R:title xmlns:R="http://www.example.com/ns/"><R:title>
属性的值出现在属性名称元素内部。该值可以是任何类型的格式良好的XML内容,包括纯文本和混合内容。服务器必须在存储和传输死属性时保留以下XML信息项(使用[REC-XML-INFOSET]中的术语):
对于属性名称元素信息项本身:
- namespace name
- local name
- attributes命名为"xml:lang"或作用域内的任何此类属性
- children类型为元素或字符
对于属性值中的所有元素信息项:
- namespace name
- local name
- attributes
- children类型为元素或字符
对于属性值中的属性信息项:
对于属性值中的字符信息项:
由于前缀在某些XML词汇表(例如XPath和XML Schema)中使用,服务器应该为值中的任何信息项保留:
上面未列出的XML Infoset属性可以由服务器保留,但客户端不得依赖它们被保留。除非另有定义,否则上述规则也将默认适用于活属性。
服务器必须忽略XML属性xml:space(如果存在),并且永远不要使用它来更改空白处理。属性值中的空白是有意义的。
4.3.1 示例 - 包含混合内容的属性 (Example - Property with Mixed Content)
考虑客户端创建的死属性'author'如下:
<D:prop xml:lang="en" xmlns:D="DAV:">
<x:author xmlns:x='http://example.com/ns'>
<x:name>Jane Doe<x:name>
<!-- Jane's contact info -->
<x:uri type='email'
added='2005-11-26'>mailto:[email protected]<x:uri>
<x:uri type='web'
added='2005-11-27'>http://www.example.com<x:uri>
<x:notes xmlns:h='http://www.w3.org/1999/xhtml'>
Jane has been working way <h:em>too<h:em> long on the
long-awaited revision of <![CDATA[<RFC2518>]]>.
<x:notes>
<x:author>
<D:prop>
请求此属性时,服务器可能返回:
<D:prop xmlns:D='DAV:'><author
xml:lang='en'
xmlns:x='http://example.com/ns'
xmlns='http://example.com/ns'
xmlns:h='http://www.w3.org/1999/xhtml'>
<x:name>Jane Doe<x:name>
<x:uri added="2005-11-26" type="email"
>mailto:[email protected]<x:uri>
<x:uri added="2005-11-27" type="web"
>http://www.example.com<x:uri>
<x:notes>
Jane has been working way <h:em>too<h:em> long on the
long-awaited revision of <RFC2518>.
<x:notes>
</author>
<D:prop>
在此示例中请注意:
- 属性名称本身的[prefix]没有被保留,因为它不重要,而所有其他[prefix]值都已被保留,
- 属性值已用双引号而不是单引号重写(引号样式不重要),并且属性顺序未被保留,
- xml:lang属性已在属性名称元素本身上返回(设置属性时它在作用域内,但响应中的确切位置不被视为重要,只要它在作用域内),
- 标签之间的空白已在所有地方保留(属性之间的空白则不然),
- CDATA封装已替换为字符转义(反之亦然也是合法的),
- 注释项已被剥离(处理指令项也会被剥离)。
实现说明:在某些情况下(如编辑场景),客户端可能需要逐字符保留XML内容(如属性顺序或引号样式)。在这种情况下,客户端应考虑使用纯文本属性值,方法是转义在XML解析中具有特殊含义的所有字符。
4.4 属性名称 (Property Names)
属性名称是一个全局唯一标识符,与提供有关属性语法和语义信息的模式关联。
因为属性的名称是全局唯一的,所以客户端可以依赖于跨多个资源、在同一服务器和不同服务器上的特定属性的一致行为,只要该属性在相关资源上是"活"的,并且活属性的实现忠实于其定义。
XML命名空间机制(基于URI[RFC3986])用于命名属性,因为它可以防止命名空间冲突并提供不同程度的管理控制。
属性命名空间是扁平的;也就是说,没有明确识别属性的层次结构。因此,如果资源上存在属性A和属性A/B,则不识别两个属性之间的任何关系。预计最终将产生一个单独的规范来解决与分层属性相关的问题。
最后,不可能在单个资源上两次定义相同的属性,因为这会导致资源属性命名空间中的冲突。
4.5 源资源和输出资源 (Source Resources and Output Resources)
某些HTTP资源由服务器动态生成。对于这些资源,可能存在某处的源代码控制该资源的生成方式。源文件与输出HTTP资源的关系可能是一对一、一对多、多对一或多对多。HTTP中没有机制来确定资源是否是动态的,更不用说其源文件的存在位置或如何创作它们。尽管解决这个问题会很有用,但可互操作的WebDAV实现已被广泛部署,而实际上并没有解决这个问题,只是处理静态资源。因此,源与输出问题在本规范中没有解决,已推迟到单独的文档中。