Skip to main content

附录A. 处理XML元素的注意事项 (Notes on Processing XML Elements)

附录A. 处理XML元素的注意事项 (Notes on Processing XML Elements)

A.1. 空XML元素的注意事项 (Notes on Empty XML Elements)

XML支持两种机制来指示XML元素没有任何内容。第一种是声明形式为<A></A>的XML元素。第二种是声明形式为<A/>的XML元素。这两个XML元素在语义上是相同的。

A.2. 非法XML处理的注意事项 (Notes on Illegal XML Processing)

XML是一种灵活的数据格式,可以轻松提交看似合法但实际上不合法的数据。"在接受内容时要灵活,在发送内容时要严格"的理念仍然适用,但不得不适当地应用。XML在处理空白、元素排序、插入新元素等问题时非常灵活。这种灵活性不需要扩展,特别是在元素含义方面。

接受非法的XML元素组合没有任何好处。充其量,它会导致不需要的结果,最坏的情况下会造成真正的损害。

A.3. 示例 - XML语法错误 (Example - XML Syntax Error)

以下PROPFIND方法的请求主体是非法的。

<?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元素作为真正的元素并对其响应。通过带宽受限线路运行的客户端如果打算执行propname,如果服务器将命令视为allprop,将会大吃一惊。

此外,如果服务器宽容并决定响应此请求,结果将在服务器之间随机变化,一些服务器执行allprop指令,而其他服务器执行propname指令。这降低了互操作性而不是提高了互操作性。

A.4. 示例 - 意外的XML元素 (Example - Unexpected XML Element)

前面的示例是非法的,因为它包含两个明确禁止在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。