1

Я пытаюсь размонтировать некоторый XML, на самом деле язык разметки географии (GML).Ошибка unmarshalling GML с кодировкой golang/xml

У меня есть пример на http://play.golang.org/p/qS6GjCOtHF

Две проблемы, первая:

ошибка чтения XML main.FeatureCollection поле "LowerCorner" с тегом "boundedBy> Envelope> lowerCorner" конфликты с полем «Конверт "с тегом" boundedBy> Envelope "

Я понятия не имею, как это исправить. Я прокомментировал это и получил GML, чтобы его можно было без помех, но затем Features в FeatureCollection.

Любые подсказки?

Пример 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... 
} 

ответ

1

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 который работает без ошибок.

Чтобы убедиться, что ваша структура содержит всю unmarshalled информацию из 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} Схема: http://www.safe.com/gml/fme tblMainGML.xsd FeaturesGML: [{ID: id5255fa48-42b3-43d1-9e0d-b2ba8b57a936 PlaceID: 45880 StateID: QLD Почтовый индекс: CGDN: N Map100K: 7272 Точка: {SrsName: EPSG: 3112 SrsDimension: 2 Pos: 141.625915527344 -12.5836181640625} VariantName: RecordID: QLD48234 LatSeconds: 0 Статус: U LongSeconds: 32 ConciseGAZ: N Lattitude: -12.58361 AuthorityID: QLD Долгота: 141.62583 LongMinutes: 37 LatDegrees: -12 ИМЯ: ТОЧКА ХАММАНА LatMinutes: 35 ObjectID: 1 FeatCode: PT LongDegrees: 141}]}

+0

Спасибо, я, вероятно, должен был упомянуть, что оригинальная маркировка пришла с использованием github.com/wicast/xj2s. Я изменил плоскую структуру, с которой столкнулся инструмент, но, очевидно, ошибся. Я думал, что теги были немного подробными. Теперь все работает отлично. – user6186749

 Смежные вопросы

  • Нет связанных вопросов^_^