Transaction 请求 |
Transaction 操作支持通过 POST 请求实现添加要素、更新要素、替换要素以及删除要素功能,请求体采用 XML 格式,主要节点要素介绍如下:
表1 Transaction 操作请求体节点元素
请求参数 | 是否必需 | 描述 |
<Transaction> |
是 |
执行事务请求时的根元素。 一个 Transaction 元素可包含 0 个或多个用于添加、更新、替换、删除要素的 Insert、Update、Replace 或 Delete 元素。当 Transaction 元素中不包含 Insert、Update、Replace 或 Delete 元素时,Transaction 操作无意义。WFS 服务会按照 Transaction 事物请求中,Insert、Update、Replace 和 Delete 元素出现的先后顺序依次对其进行处理。 Transaction 元素还可包含 0 个或多个用于描述供应商特定操作的 Native 元素。 |
<Insert> |
否 |
添加新要素操作时必选。 Insert 元素用于向 WFS 服务的数据存储中添加新要素。默认情况下,使用 GML 语言去表达新添加要素的初始状态,并且新添加要素的初始状态应该使用 DescribeFeatureType 操作描述的 GML schema 去验证。一个 Transaction 请求可以包含多个 Insert 元素,每个 Insert 元素可以添加一个要素。 |
<Update> |
否 |
更新要素操作时必选。 用 typeName 属性指定需要更新的要素类型。Update 元素可以包含一个或多个 Property 元素,该元素用于指定需要更新的要素的属性(ValueReference 元素)和属性值(Value 元素)。 一个 Transaction 请求可以包含多个 Update 元素,以实现多个相同或不同类型的要素更新。 Update 元素中可以包含一个或多个 Filter 元素,用于指定待更新要素。 |
<Replace> |
否 |
替换要素操作时必选。 Replace 操作和 Update 操作不同,Update 操作用于更新要素的个别属性,而 Replace 操作是用指定要素完全替换目标要素,替换后两个要素的属性值一致。 Replace 元素中可以包含一个或多个 Filter 元素,用于指定会被替换的要素。 |
<Delete> |
否 |
删除要素操作时必选。 用 typeName 属性指定需要删除的要素类型。 Delete 元素中可以包含一个或多个 Filter 元素,用于指定待删除要素。 |
<Native> |
否 |
添加新要素操作时必选。 Native 元素只包含供应商特定的命令或操作,允许访问特殊 WFS 或数据存储的供应商特定能力。 目前 SuperMap iServer 不支持该参数。 |
本示例中对 WFS 服务 data-world/wfs200 进行了4次 Transaction 操作。先添加了两个新要素(为了介绍方便,假定两个要素分别为 A、B),然后更新了 A 要素,接着用更新后的 A 要素替换 B 要素,最后删除了属性值相同的 A 和 B 要素。即对 http://localhost:8090/iserver/services/data-World/wfs200 ,执行 POST 请求,分别传输以下请求体:
执行 POST 请求,在 World:Capitals 图层中创建了 A 和 B 两个要素。A 要素的 CAPITAL 字段值为 testCapital ,COUNTRY 字段值为 testCountry ,B 要素的 CAPITAL 字段值为 testCapital2 ,COUNTRY 字段值为 testCountry2。 对应请求体如下:
<wfs:Transaction version="2.0.0" service="WFS"
xmlns="http://www.someserver.example.com/myns" xmlns:wfs="http://www.opengis.net/wfs/2.0"
xmlns:fes="http://www.opengis.net/fes/2.0" xmlns:gml="http://www.opengis.net/gml/3.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.someserver.example.com/myns ./SampleSchema.xsd
http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd
http://www.opengis.net/gml/3.2
http://schemas.opengis.net/gml/3.2.1/gml.xsd">
<wfs:Insert>
<World:Capitals xmlns:World="https://www.supermap.com.cn/World">
<World:CAPITAL>testCapital</World:CAPITAL>
<World:COUNTRY>testCountry</World:COUNTRY>
<World:the_geom>
<gml:Point srsName="EPSG:4326">
<gml:coordinates>143.09,35.57</gml:coordinates>
</gml:Point>
</World:the_geom>
</World:Capitals>
</wfs:Insert>
<wfs:Insert>
<World:Capitals xmlns:World="https://www.supermap.com.cn/World">
<World:CAPITAL>testCapital2</World:CAPITAL>
<World:COUNTRY>testCountry2</World:COUNTRY>
<World:the_geom>
<gml:Point srsName="EPSG:4326">
<gml:coordinates>143.09,35.57</gml:coordinates>
</gml:Point>
</World:the_geom>
</World:Capitals>
</wfs:Insert>
</wfs:Transaction>
添加要素成功后,响应参见:响应示例。
执行 POST 请求,将 A 要素的 CAPITAL 字段值改为 otherCapital。对应请求体如下:
<?xml version="1.0" ?>
<wfs:Transaction version="2.0.0" service="WFS"
xmlns:World="http://www.someserver.example.com/myns" xmlns:fes="http://www.opengis.net/fes/2.0"
xmlns:wfs="http://www.opengis.net/wfs/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd">
<wfs:Update typeName="World:Capitals">
<wfs:Property>
<wfs:ValueReference>World/Capitals/CAPITAL</wfs:ValueReference>
<wfs:Value>otherCapital</wfs:Value>
</wfs:Property>
<fes:Filter>
<fes:PropertyIsEqualTo>
<fes:ValueReference>World/Capitals/COUNTRY</fes:ValueReference>
<fes:Literal>testCountry</fes:Literal>
</fes:PropertyIsEqualTo>
</fes:Filter>
</wfs:Update>
</wfs:Transaction>
更新要素成功后,响应参见:响应示例。
注:wfs:Transaction 根节点中定义的命名空间应与 typeName 中的值对应,如 命名空间为 xmlns:World="http://www.someserver.example.com/myns",typeName 的值为 World:Capitals。
执行 POST 请求,用更新后的 A 要素替换 B 要素,替换后 A 和 B 两个要素的属性值相同, CAPITAL 字段值为 otherCapital,COUNTRY 字段值为 testCountry。对应请求体如下:
<?xml version="1.0" ?>
<wfs:Transaction
version="2.0.0"
service="WFS"
xmlns:World="http://www.someserver.example.com/myns"
xmlns:fes="http://www.opengis.net/fes/2.0"
xmlns:wfs="http://www.opengis.net/wfs/2.0"
xmlns:gml="http://www.opengis.net/gml/3.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd">
<wfs:Replace>
<World:Capitals xmlns:World="https://www.supermap.com.cn/World">
<World:CAPITAL>otherCapital</World:CAPITAL>
<World:COUNTRY>testCountry</World:COUNTRY>
<World:the_geom>
<gml:Point srsName="EPSG:4326">
<gml:coordinates>143.0901,35.5701</gml:coordinates>
</gml:Point>
</World:the_geom>
</World:Capitals>
<fes:Filter>
<fes:PropertyIsEqualTo>
<fes:ValueReference>World/Capitals/COUNTRY</fes:ValueReference>
<fes:Literal>testCountry2</fes:Literal>
</fes:PropertyIsEqualTo>
</fes:Filter>
</wfs:Replace>
</wfs:Transaction>
替换要素成功后,响应参见:响应示例。
执行 POST 请求,将 World:Capitals 图层中 CAPITAL 字段值为 otherCapital 的要素删除,即删除 A 和 B 两个元素。对应请求体如下:
<?xml version="1.0" ?>
<wfs:Transaction
version="2.0.0"
service="WFS"
xmlns:World="https://www.supermap.com.cn/World"
xmlns:fes="http://www.opengis.net/fes/2.0"
xmlns:wfs="http://www.opengis.net/wfs/2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd">
<wfs:Delete typeName="World:Capitals">
<fes:Filter>
<fes:PropertyIsEqualTo>
<fes:ValueReference>World/Capitals/CAPITAL</fes:ValueReference>
<fes:Literal>otherCapital</fes:Literal>
</fes:PropertyIsEqualTo>
</fes:Filter>
</wfs:Delete>
</wfs:Transaction>
删除要素成功后,响应参见:响应示例。
注:wfs:Transaction 根节点中定义的命名空间应与 typeName 中的值对应,如 命名空间为 xmlns:World="https://www.supermap.com.cn/World",typeName 的值为 World:Capitals。