附录 A. 处理 XML 元素的注意事项
A.1. 空 XML 元素的注意事项
XML 支持两种表明 XML元素中没有内容的机制. 第一种是声明一个形式为 <A></A> 的 XML元素.
第二种是声明一个形式为 <A/> 的 XML元素. 这两种 XML元素在语义上是相同的.
A.2. 非法 XML 处理的注意事项
XML 是一种具有弹性的数据格式, 可以轻松提交看似合法但实际上不合法的数据. "在接受时保持灵活, 在发送时保持严格" 的哲学仍然适用, 但不应不合时宜地使用. XML 在处理空格,元素顺序, 插入新元素等方面非常灵活. 这种灵活性, 尤其在元素含义方面不需要扩展.
接受不合法的 XML元素组合是没有好处的. 最好情况是产生不希望的结果, 最坏则可能会造成实际损害.
A.3. 示例 - XML 语法错误
<?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:">
<D:allprop/>
<D:propname/>
</D:propfind>
propfind元素的定义仅允许 allprop 或 propname元素, 而不允许两者同时存在.
因此, 上述情况是错误的, 必须响应 400 (Bad Request).
然而, 想象一下, 如果服务器希望 "友好" 一些, 并决定选择 allprop元素作对其进行响应.
如果服务器将命令视为 allprop, 那么在带宽受限的链路上运行的客户端打算执行 propname 操作时,
将会 "大吃一惊".
此外, 如果服务器较为宽松并决定回应此请求, 那么结果将因服务器而异,
一些服务器执行 allprop 指令, 而另一些执行 propname 指令. 这会降低而不是增加互操作性.
A.4. 示例 - 意料外的 XML 元素
上一节的示例是非法的, 因为其同时包含了两个明确禁止同时出现在 propfind元素中的元素.
然而, XML 是一种可扩展的语言, 因此可以想象为 propfind 定义新的元素.
下面是一个 PROPFIND 的请求正文, 与之前的示例一样, 如果服务器不理解 expired-props元素,
必须拒绝并返回 400 (Bad Request).
<?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:"
xmlns:E="http://www.example.com/standards/props/">
<E:expired-props/>
</D:propfind>
为了理解为什么会返回 400 (Bad Request), 让我们观察服务器在不了解 expired-props 的情况下如何看待请求正文.
<?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:"
xmlns:E="http://www.example.com/standards/props/">
</D:propfind>
由于服务器不理解 expired-props元素, 根据在第 17 章中指出的 WebDAV 特定 XML 处理规则,
其必须将请求处理为该元素不存在一样. 因此, 服务器看到一个空的 propfind,
这种 propfind元素的定义是非法的.
需要注意的是, 如果扩展是可扩展的, 其不一定会导致 400 (Bad Request). 例如, 想象一个用于 PROPFIND 的请求正文:
<?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:"
xmlns:E="http://www.example.com/standards/props/">
<D:propname/>
<E:leave-out>*boss*</E:leave-out>
</D:propfind>
上述示例包含了虚构的元素leave-out. 该元素目的是阻止返回与提交的模式匹配的任何属性.
如果将上述示例提交给不了解 leave-out 的服务器, 唯一的结果将是 leave-out元素被忽略,
然后 propname 被执行.