Merge pull request #12936 from ejn/bugfix/gml-multiple-element-parsing
Bugfix for GML parsing with multiple property elements with XML attributes
This commit is contained in:
@@ -319,6 +319,15 @@ class GMLBase extends XMLFeature {
|
||||
}
|
||||
}
|
||||
|
||||
const len = n.attributes.length;
|
||||
if (len > 0) {
|
||||
value = {_content_: value};
|
||||
for (let i = 0; i < len; i++) {
|
||||
const attName = n.attributes[i].name;
|
||||
value[attName] = n.attributes[i].value;
|
||||
}
|
||||
}
|
||||
|
||||
if (values[localName]) {
|
||||
if (!(values[localName] instanceof Array)) {
|
||||
values[localName] = [values[localName]];
|
||||
@@ -327,15 +336,6 @@ class GMLBase extends XMLFeature {
|
||||
} else {
|
||||
values[localName] = value;
|
||||
}
|
||||
|
||||
const len = n.attributes.length;
|
||||
if (len > 0) {
|
||||
values[localName] = {_content_: values[localName]};
|
||||
for (let i = 0; i < len; i++) {
|
||||
const attName = n.attributes[i].name;
|
||||
values[localName][attName] = n.attributes[i].value;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!asFeature) {
|
||||
return values;
|
||||
|
||||
@@ -1840,6 +1840,10 @@ describe('ol.format.GML3', function () {
|
||||
expect(features[0].values_['name']).to.have.length(2);
|
||||
});
|
||||
|
||||
it('parses mutliple simple elements to strings', function () {
|
||||
expect(features[0].values_['name'][0]).to.be.a('string');
|
||||
});
|
||||
|
||||
it('creates nested property', function () {
|
||||
expect(
|
||||
features[0].values_['observationMethod']['CGI_TermValue']['value'][
|
||||
@@ -2902,4 +2906,49 @@ describe('ol.format.GML32', function () {
|
||||
expect(features[0].get('cdata')).to.be('<a>b</a>');
|
||||
});
|
||||
});
|
||||
|
||||
describe('when parsing multiple complex attributes', function () {
|
||||
let features;
|
||||
let gmlFormat;
|
||||
before(function (done) {
|
||||
afterLoadText('spec/ol/format/gml/gml32-complex.xml', function (xml) {
|
||||
try {
|
||||
gmlFormat = new GML32();
|
||||
features = gmlFormat.readFeatures(xml);
|
||||
} catch (e) {
|
||||
done(e);
|
||||
}
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('creates 2 features', function () {
|
||||
expect(features).to.have.length(2);
|
||||
});
|
||||
|
||||
it('creates feature with three attributeA properties and two attributeB properties', function () {
|
||||
expect(features[0].values_['attributeA']).to.have.length(3);
|
||||
expect(features[0].values_['attributeB']).to.have.length(2);
|
||||
});
|
||||
|
||||
it('parses mutliple complex elements to an array of objects', function () {
|
||||
expect(features[0].values_['attributeA'][0]).to.be.a('object');
|
||||
});
|
||||
|
||||
it('correctly structures multiple elements with attributes', function () {
|
||||
expect(features[0].values_['attributeA'][0]['xlink:href']).to.be(
|
||||
'http://www.example.com/extern/1'
|
||||
);
|
||||
expect(features[0].values_['attributeA'][0]._content_).to.be(undefined);
|
||||
expect(features[0].values_['attributeA'][1]['xlink:href']).to.be(
|
||||
'http://www.example.com/extern/2'
|
||||
);
|
||||
expect(features[0].values_['attributeA'][2]._content_).to.be(undefined);
|
||||
});
|
||||
|
||||
it('correctly structures multiple elements with complex content', function () {
|
||||
expect(features[0].values_['attributeB'][0].Attribute.value).to.be('foo');
|
||||
expect(features[0].values_['attributeB'][1].Attribute.value).to.be('bar');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
49
test/browser/spec/ol/format/gml/gml32-complex.xml
Normal file
49
test/browser/spec/ol/format/gml/gml32-complex.xml
Normal file
@@ -0,0 +1,49 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<gml:FeatureCollection gml:id="collection.0" xmlns:ex="http://www.example.com" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<gml:featureMember>
|
||||
<ex:FeatureA gml:id="feature.a">
|
||||
<gml:identifier codeSpace="http://www.example.com">featureA</gml:identifier>
|
||||
<ex:attributeA xlink:href="http://www.example.com/extern/1" />
|
||||
<ex:attributeA xlink:href="http://www.example.com/extern/2" />
|
||||
<ex:attributeA xlink:href="http://www.example.com/extern/3" />
|
||||
<ex:attributeB>
|
||||
<ex:Attribute>
|
||||
<ex:value>foo</ex:value>
|
||||
</ex:Attribute>
|
||||
</ex:attributeB>
|
||||
<ex:attributeB>
|
||||
<ex:Attribute>
|
||||
<ex:value>bar</ex:value>
|
||||
</ex:Attribute>
|
||||
</ex:attributeB>
|
||||
<ex:location>
|
||||
<gml:Point gml:id="point.0" srsName="http://www.opengis.net/def/crs/EPSG/0/4326">
|
||||
<gml:pos srsDimensions="2">0 0</gml:pos>
|
||||
</gml:Point>
|
||||
</ex:location>
|
||||
</ex:FeatureA>
|
||||
</gml:featureMember>
|
||||
<gml:featureMember>
|
||||
<ex:FeatureB gml:id="feature.b">
|
||||
<gml:identifier codeSpace="http://www.example.com">featureB</gml:identifier>
|
||||
<ex:attributeA xlink:href="http://www.example.com/extern/4" />
|
||||
<ex:attributeA xlink:href="http://www.example.com/extern/5" />
|
||||
<ex:attributeA xlink:href="http://www.example.com/extern/6" />
|
||||
<ex:attributeB>
|
||||
<ex:Attribute>
|
||||
<ex:value>foobar</ex:value>
|
||||
</ex:Attribute>
|
||||
</ex:attributeB>
|
||||
<ex:attributeB>
|
||||
<ex:Attribute>
|
||||
<ex:value>barfoo</ex:value>
|
||||
</ex:Attribute>
|
||||
</ex:attributeB>
|
||||
<ex:location>
|
||||
<gml:Point gml:id="point.1" srsName="http://www.opengis.net/def/crs/EPSG/0/4326">
|
||||
<gml:pos srsDimensions="2">1 1</gml:pos>
|
||||
</gml:Point>
|
||||
</ex:location>
|
||||
</ex:FeatureB>
|
||||
</gml:featureMember>
|
||||
</gml:FeatureCollection>
|
||||
Reference in New Issue
Block a user