使用 golang 解组 GML 时出错 encoding/xml
Error unmarshalling GML with golang encoding/xml
我正在尝试解组一些 XML,实际上是地理标记语言 (GML)。
我在 http://play.golang.org/p/qS6GjCOtHF
有一个例子
两个问题,第一个:
error reading xml main.FeatureCollection field "LowerCorner" with tag "boundedBy>Envelope>lowerCorner" conflicts with field "Envelope" with tag "boundedBy>Envelope"
我不知道如何解决这个问题。我评论了那些并让 GML 无错误地解组但是 FeatureCollection
.
中没有 Features
有什么线索吗?
GML 的一个例子是:
<?xml version="1.0" encoding="UTF-8"?>
<gml:FeatureCollection xmlns:gml="http://www.opengis.net/gml"
xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:fme="http://www.safe.com/gml/fme" xsi:schemaLocation="http://www.safe.com/gml/fme tblMainGML.xsd">
<gml:boundedBy>
<gml:Envelope srsName="EPSG:3112" srsDimension="2">
<gml:lowerCorner>45.2921142578125 -80.2166748046875</gml:lowerCorner>
<gml:upperCorner>169.000122070313 -9.14251708984375</gml:upperCorner>
</gml:Envelope>
</gml:boundedBy>
<gml:featureMember>
<fme:GML gml:id="id5255fa48-42b3-43d1-9e0d-b2ba8b57a936">
<fme:OBJECTID>1</fme:OBJECTID>
<fme:RECORD_ID>QLD48234</fme:RECORD_ID>
<fme:NAME>HATCHMAN POINT</fme:NAME>
<fme:FEAT_CODE>PT</fme:FEAT_CODE>
<fme:CGDN>N</fme:CGDN>
<fme:AUTHORITY_ID>QLD</fme:AUTHORITY_ID>
<fme:CONCISE_GAZ>N</fme:CONCISE_GAZ>
<fme:LATITUDE>-12.58361</fme:LATITUDE>
<fme:lat_degrees>-12</fme:lat_degrees>
<fme:lat_minutes>35</fme:lat_minutes>
<fme:lat_seconds>0</fme:lat_seconds>
<fme:LONGITUDE>141.62583</fme:LONGITUDE>
<fme:long_degrees>141</fme:long_degrees>
<fme:long_minutes>37</fme:long_minutes>
<fme:long_seconds>32</fme:long_seconds>
<fme:STATE_ID>QLD</fme:STATE_ID>
<fme:STATUS>U</fme:STATUS>
<fme:VARIANT_NAME />
<fme:MAP_100K>7272</fme:MAP_100K>
<fme:Place_ID>45880</fme:Place_ID>
<gml:pointProperty>
<gml:Point srsName="EPSG:3112" srsDimension="2">
<gml:pos>141.625915527344 -12.5836181640625</gml:pos>
</gml:Point>
</gml:pointProperty>
</fme:GML>
</gml:featureMember>
</gml:FeatureCollection>
</xml>
我的结构
type FeatureCollection struct {
Xsi string `xml:"xsi,attr"`
Fme string `xml:"fme,attr"`
Gml string `xml:"gml,attr"`
Xlink string `xml:"xlink,attr"`
LowerCorner string `xml:"boundedBy>Envelope>lowerCorner"`
UpperCorner string `xml:"boundedBy>Envelope>upperCorner"`
Envelope Envelope `xml:"boundedBy>Envelope"`
SchemaLocation string `xml:"schemaLocation,attr"`
Features []Feature
}
type Feature struct {
PlaceID string `xml:"featureMember>GML>Place_ID"`
StateID string `xml:"featureMember>GML>STATE_ID"`
Postcode string `xml:"featureMember>GML>POSTCODE"`
CGDN string `xml:"featureMember>GML>CGDN"`
Map100K string `xml:"featureMember>GML>MAP_100K"`
ETC...
}
一个XML标签只能映射到(至多)一个结构字段。 encoding/xml
包必须决定每个 XML 标签将被解码到哪个结构字段。您为 XML 建模的结构很奇怪,并使这个决定变得模棱两可。
举个例子:
type FeatureCollection struct {
...
LowerCorner string `xml:"boundedBy>Envelope>lowerCorner"`
UpperCorner string `xml:"boundedBy>Envelope>upperCorner"`
Envelope Envelope `xml:"boundedBy>Envelope"`
...
}
encoding/xml
包无法决定 XML 标签 <Envelope>
应该被解码到哪里,例如进入 LowerCorner
?进入 UpperCorner
?进入 Envelope
?是的,我知道 LowerCorner
只是 <Envelope>
的子元素,但由于整个 <Envelope>
元素映射到 FeatureCollection.Envelope
,这是不允许的。
您应该将 LowerCorner
和 UpperCorner
字段移动到您的 Envelope
结构类型中,因为那是它们所属的位置并且您想要解组整个 Envelope
xml 标签(或者如果没有, FeatureCollection.Envelope
可以完全删除)。因此,请按照此模式将字段放在它们所属的位置。
这是您更新后的模型,它提取了您想要的所有信息:
type FeatureCollection struct {
Xsi string `xml:"xsi,attr"`
Fme string `xml:"fme,attr"`
Gml string `xml:"gml,attr"`
Xlink string `xml:"xlink,attr"`
Envelope Envelope `xml:"boundedBy>Envelope"`
SchemaLocation string `xml:"schemaLocation,attr"`
FeaturesGML []GML `xml:"featureMember>GML"`
}
type Envelope struct {
SrsName string `xml:"srsName,attr"`
SrsDimension string `xml:"srsDimension,attr"`
LowerCorner string `xml:"lowerCorner"`
UpperCorner string `xml:"upperCorner"`
}
type GML struct {
ID string `xml:"id,attr"`
PlaceID string `xml:"Place_ID"`
StateID string `xml:"STATE_ID"`
Postcode string `xml:"POSTCODE"`
CGDN string `xml:"CGDN"`
Map100K string `xml:"MAP_100K"`
Point Point `xml:"pointProperty>Point"`
VariantName string `xml:"VARIANT_NAME"`
RecordID string `xml:"RECORD_ID"`
LatSeconds string `xml:"lat_seconds"`
Status string `xml:"STATUS"`
LongSeconds string `xml:"long_seconds"`
ConciseGAZ string `xml:"CONCISE_GAZ"`
Lattitude string `xml:"LATITUDE"`
AuthorityID string `xml:"AUTHORITY_ID"`
Longitude string `xml:"LONGITUDE"`
LongMinutes string `xml:"long_minutes"`
LatDegrees string `xml:"lat_degrees"`
NAME string `xml:"NAME"`
LatMinutes string `xml:"lat_minutes"`
ObjectID string `xml:"OBJECTID"`
FeatCode string `xml:"FEAT_CODE"`
LongDegrees string `xml:"long_degrees"`
}
type Point struct {
SrsName string `xml:"srsName,attr"`
SrsDimension string `xml:"srsDimension,attr"`
Pos string `xml:"pos"`
}
这是您在 Go Playground 上的代码的修改版本,运行时没有错误。
验证您的结构是否包含来自 XML 的所有未编组信息:
fmt.Printf("%+v", v)
输出:
&{Xsi:http://www.w3.org/2001/XMLSchema-instance Fme:http://www.safe.com/gml/fme Gml:http://www.opengis.net/gml Xlink:http://www.w3.org/1999/xlink Envelope:{SrsName:EPSG:3112 SrsDimension:2 LowerCorner:45.2921142578125 -80.2166748046875 UpperCorner:169.000122070313 -9.14251708984375} SchemaLocation:http://www.safe.com/gml/fme tblMainGML.xsd FeaturesGML:[{ID:id5255fa48-42b3-43d1-9e0d-b2ba8b57a936 PlaceID:45880 StateID:QLD Postcode: CGDN:N Map100K:7272 Point:{SrsName:EPSG:3112 SrsDimension:2 Pos:141.625915527344 -12.5836181640625} VariantName: RecordID:QLD48234 LatSeconds:0 Status:U LongSeconds:32 ConciseGAZ:N Lattitude:-12.58361 AuthorityID:QLD Longitude:141.62583 LongMinutes:37 LatDegrees:-12 NAME:HATCHMAN POINT LatMinutes:35 ObjectID:1 FeatCode:PT LongDegrees:141}]}
我正在尝试解组一些 XML,实际上是地理标记语言 (GML)。
我在 http://play.golang.org/p/qS6GjCOtHF
有一个例子两个问题,第一个:
error reading xml main.FeatureCollection field "LowerCorner" with tag "boundedBy>Envelope>lowerCorner" conflicts with field "Envelope" with tag "boundedBy>Envelope"
我不知道如何解决这个问题。我评论了那些并让 GML 无错误地解组但是 FeatureCollection
.
Features
有什么线索吗?
GML 的一个例子是:
<?xml version="1.0" encoding="UTF-8"?>
<gml:FeatureCollection xmlns:gml="http://www.opengis.net/gml"
xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:fme="http://www.safe.com/gml/fme" xsi:schemaLocation="http://www.safe.com/gml/fme tblMainGML.xsd">
<gml:boundedBy>
<gml:Envelope srsName="EPSG:3112" srsDimension="2">
<gml:lowerCorner>45.2921142578125 -80.2166748046875</gml:lowerCorner>
<gml:upperCorner>169.000122070313 -9.14251708984375</gml:upperCorner>
</gml:Envelope>
</gml:boundedBy>
<gml:featureMember>
<fme:GML gml:id="id5255fa48-42b3-43d1-9e0d-b2ba8b57a936">
<fme:OBJECTID>1</fme:OBJECTID>
<fme:RECORD_ID>QLD48234</fme:RECORD_ID>
<fme:NAME>HATCHMAN POINT</fme:NAME>
<fme:FEAT_CODE>PT</fme:FEAT_CODE>
<fme:CGDN>N</fme:CGDN>
<fme:AUTHORITY_ID>QLD</fme:AUTHORITY_ID>
<fme:CONCISE_GAZ>N</fme:CONCISE_GAZ>
<fme:LATITUDE>-12.58361</fme:LATITUDE>
<fme:lat_degrees>-12</fme:lat_degrees>
<fme:lat_minutes>35</fme:lat_minutes>
<fme:lat_seconds>0</fme:lat_seconds>
<fme:LONGITUDE>141.62583</fme:LONGITUDE>
<fme:long_degrees>141</fme:long_degrees>
<fme:long_minutes>37</fme:long_minutes>
<fme:long_seconds>32</fme:long_seconds>
<fme:STATE_ID>QLD</fme:STATE_ID>
<fme:STATUS>U</fme:STATUS>
<fme:VARIANT_NAME />
<fme:MAP_100K>7272</fme:MAP_100K>
<fme:Place_ID>45880</fme:Place_ID>
<gml:pointProperty>
<gml:Point srsName="EPSG:3112" srsDimension="2">
<gml:pos>141.625915527344 -12.5836181640625</gml:pos>
</gml:Point>
</gml:pointProperty>
</fme:GML>
</gml:featureMember>
</gml:FeatureCollection>
</xml>
我的结构
type FeatureCollection struct {
Xsi string `xml:"xsi,attr"`
Fme string `xml:"fme,attr"`
Gml string `xml:"gml,attr"`
Xlink string `xml:"xlink,attr"`
LowerCorner string `xml:"boundedBy>Envelope>lowerCorner"`
UpperCorner string `xml:"boundedBy>Envelope>upperCorner"`
Envelope Envelope `xml:"boundedBy>Envelope"`
SchemaLocation string `xml:"schemaLocation,attr"`
Features []Feature
}
type Feature struct {
PlaceID string `xml:"featureMember>GML>Place_ID"`
StateID string `xml:"featureMember>GML>STATE_ID"`
Postcode string `xml:"featureMember>GML>POSTCODE"`
CGDN string `xml:"featureMember>GML>CGDN"`
Map100K string `xml:"featureMember>GML>MAP_100K"`
ETC...
}
一个XML标签只能映射到(至多)一个结构字段。 encoding/xml
包必须决定每个 XML 标签将被解码到哪个结构字段。您为 XML 建模的结构很奇怪,并使这个决定变得模棱两可。
举个例子:
type FeatureCollection struct {
...
LowerCorner string `xml:"boundedBy>Envelope>lowerCorner"`
UpperCorner string `xml:"boundedBy>Envelope>upperCorner"`
Envelope Envelope `xml:"boundedBy>Envelope"`
...
}
encoding/xml
包无法决定 XML 标签 <Envelope>
应该被解码到哪里,例如进入 LowerCorner
?进入 UpperCorner
?进入 Envelope
?是的,我知道 LowerCorner
只是 <Envelope>
的子元素,但由于整个 <Envelope>
元素映射到 FeatureCollection.Envelope
,这是不允许的。
您应该将 LowerCorner
和 UpperCorner
字段移动到您的 Envelope
结构类型中,因为那是它们所属的位置并且您想要解组整个 Envelope
xml 标签(或者如果没有, FeatureCollection.Envelope
可以完全删除)。因此,请按照此模式将字段放在它们所属的位置。
这是您更新后的模型,它提取了您想要的所有信息:
type FeatureCollection struct {
Xsi string `xml:"xsi,attr"`
Fme string `xml:"fme,attr"`
Gml string `xml:"gml,attr"`
Xlink string `xml:"xlink,attr"`
Envelope Envelope `xml:"boundedBy>Envelope"`
SchemaLocation string `xml:"schemaLocation,attr"`
FeaturesGML []GML `xml:"featureMember>GML"`
}
type Envelope struct {
SrsName string `xml:"srsName,attr"`
SrsDimension string `xml:"srsDimension,attr"`
LowerCorner string `xml:"lowerCorner"`
UpperCorner string `xml:"upperCorner"`
}
type GML struct {
ID string `xml:"id,attr"`
PlaceID string `xml:"Place_ID"`
StateID string `xml:"STATE_ID"`
Postcode string `xml:"POSTCODE"`
CGDN string `xml:"CGDN"`
Map100K string `xml:"MAP_100K"`
Point Point `xml:"pointProperty>Point"`
VariantName string `xml:"VARIANT_NAME"`
RecordID string `xml:"RECORD_ID"`
LatSeconds string `xml:"lat_seconds"`
Status string `xml:"STATUS"`
LongSeconds string `xml:"long_seconds"`
ConciseGAZ string `xml:"CONCISE_GAZ"`
Lattitude string `xml:"LATITUDE"`
AuthorityID string `xml:"AUTHORITY_ID"`
Longitude string `xml:"LONGITUDE"`
LongMinutes string `xml:"long_minutes"`
LatDegrees string `xml:"lat_degrees"`
NAME string `xml:"NAME"`
LatMinutes string `xml:"lat_minutes"`
ObjectID string `xml:"OBJECTID"`
FeatCode string `xml:"FEAT_CODE"`
LongDegrees string `xml:"long_degrees"`
}
type Point struct {
SrsName string `xml:"srsName,attr"`
SrsDimension string `xml:"srsDimension,attr"`
Pos string `xml:"pos"`
}
这是您在 Go Playground 上的代码的修改版本,运行时没有错误。
验证您的结构是否包含来自 XML 的所有未编组信息:
fmt.Printf("%+v", v)
输出:
&{Xsi:http://www.w3.org/2001/XMLSchema-instance Fme:http://www.safe.com/gml/fme Gml:http://www.opengis.net/gml Xlink:http://www.w3.org/1999/xlink Envelope:{SrsName:EPSG:3112 SrsDimension:2 LowerCorner:45.2921142578125 -80.2166748046875 UpperCorner:169.000122070313 -9.14251708984375} SchemaLocation:http://www.safe.com/gml/fme tblMainGML.xsd FeaturesGML:[{ID:id5255fa48-42b3-43d1-9e0d-b2ba8b57a936 PlaceID:45880 StateID:QLD Postcode: CGDN:N Map100K:7272 Point:{SrsName:EPSG:3112 SrsDimension:2 Pos:141.625915527344 -12.5836181640625} VariantName: RecordID:QLD48234 LatSeconds:0 Status:U LongSeconds:32 ConciseGAZ:N Lattitude:-12.58361 AuthorityID:QLD Longitude:141.62583 LongMinutes:37 LatDegrees:-12 NAME:HATCHMAN POINT LatMinutes:35 ObjectID:1 FeatCode:PT LongDegrees:141}]}