xml с wfs: транзакция / запрос на вставку не проходит проверку по xsd-схеме WFS
Проблема, которую я пытаюсь решить, связана с взаимодействием между OpenLayers и TinyOWS, а именно вставкой новой функции, но я не буду публиковать здесь ни Javascript-код, ни настройки TinyOWS, потому что они не имеют отношения к проблеме проверки xml. Я пытался выделить проблему как можно больше. Вот код python2, использующий библиотеку lxml для проверки XML по схеме:
from lxml import etree
from StringIO import StringIO
parser = etree.XMLParser(no_network=False)
etree.set_default_parser(parser)
schema_doc = etree.parse(StringIO('''\
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:gml="http://www.opengis.net/gml" xmlns:tows="http://www.tinyows.org/" targetNamespace="http://www.tinyows.org/" elementFormDefault="qualified" version="1.1">
<xs:import namespace="http://www.opengis.net/wfs" schemaLocation="http://schemas.opengis.net/wfs/1.1.0/wfs.xsd"/>
<xs:import namespace="http://www.opengis.net/gml" schemaLocation="http://schemas.opengis.net/gml/3.1.1/base/gml.xsd"/>
<xs:element name="cities" type="tows:citiesType" substitutionGroup="gml:_Feature"/>
<xs:complexType name="citiesType">
<xs:complexContent>
<xs:extension base="gml:AbstractFeatureType">
<xs:sequence>
<xs:element name="type_id" type="int" nillable="true" minOccurs="0" maxOccurs="1"/>
<xs:element name="properties" type="string" nillable="true" minOccurs="0" maxOccurs="1"/>
<xs:element name="geom" type="gml:PointPropertyType" nillable="true" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
'''))
xml = etree.parse(StringIO('''\
<wfs:Transaction xmlns:wfs="http://www.opengis.net/wfs">
<wfs:Insert>
<feature:cities xmlns:feature="http://www.tinyows.org">
<feature:geom>
<gml:Point xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:4326">
<gml:pos>37.935083007812 55.4423828125</gml:pos>
</gml:Point>
</feature:geom>
</feature:cities>
</wfs:Insert>
</wfs:Transaction>'''))
schema = etree.XMLSchema(schema_doc)
schema.assertValid(xml)
Здесь я получаю ошибку:
lxml.etree.DocumentInvalid: Element '{http://www.tinyows.org}cities': This element is not expected. Expected is one of ( {http://www.opengis.net/gml}_Feature, http://www.opengis.net/gml}FeatureCollection, {http://www.opengis.net/gml}MultiPointCoverage, {http://www.opengis.net/gml}MultiCurveCoverage, {http://www.opengis.net/gml}MultiSurfaceCoverage, {http://www.opengis.net/gml}MultiSolidCoverage, {http://www.opengis.net/gml}GridCoverage, {http://www.opengis.net/gml}RectifiedGridCoverage, {http://www.opengis.net/gml}Observation, {http://www.opengis.net/gml}DirectedObservation )., line 3
Это кажется загадочным для меня, потому что cities
функция определена, чтобы заменить gml:_Feature
в схеме. Возможно, ответ должен лежать в http://schemas.opengis.net/wfs/1.1.0/wfs.xsd, но я не могу понять логику проверки.
1 ответ
Я обнаружил, что строка <feature:cities xmlns:feature="http://www.tinyows.org">
был корнем всего зла, а именно отсутствующей косой чертой в http://www.tinyows.org
Пространство имен. Изменил это на <feature:cities xmlns:feature="http://www.tinyows.org/">
решил проблему. Каждый символ имеет значение!