2017-02-13 6 views
1

Я пытаюсь извлечь метаданные из документа .odt.Unmarshal namespaced Теги XML - Golang

Файл, содержащий XML называется meta.xml

Он имеет такую ​​структуру:

<?xml version="1.0" encoding="UTF-8"?> 
<office:document-meta xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" office:version="1.2"> 
    <office:meta> 
     <meta:creation-date>2016-10-18T15:05:19.137453293</meta:creation-date> 
     <dc:title>Document</dc:title> 
     <dc:date>2017-01-17T00:59:04.731054728</dc:date> 
     <meta:document-statistic meta:page-count="1" meta:word-count="0" meta:character-count="0"/> 
    </office:meta> 
</office:document-meta> 

Я использую xml.Unmarshal()encoding/xml из пакета для разбора XML и поместить значения в поле структуры.

Это структура Я использую:

type Query struct { 
    CreationDate string `xml:""` 
    PageCount int `xml:""` 
    WordCount int `xml:""` 
    CharCount int `xml:""` 
} 

То, что я понял из имеющейся документации, что я могу использовать полевые тег типа xml:"tag-name", чтобы получить значение XML тега, и xml:name,attr получить значение атрибута.

Однако, поскольку XML-файл имеет теги с расширением имен (например, meta:creation-date), все, что я пробовал до сих пор, оставляет поля структуры пустыми. Хотя, возможно, я ошибаюсь.

Это целая программа внутри Go детской площадки: https://play.golang.org/p/n7C50l1gsV

+0

https://github.com/golang/go/issues/9519 - последний комментарий предполагает, что поддерживаются только префиксные атрибуты (не элементы). –

+0

Как я могу извлечь только префиксные атрибуты? Пример: 'meta: word-count =" 0 "' или они также недоступны, потому что тег находится на расстоянии от имени? – Anurope

+0

Вот обновленная версия вашей игровой площадки [код] (https://play.golang.org/p/YFO5jp70gN), которая может помочь. –

ответ

1

Вы обнаружите, что дела идут более гладко, если ваши карты достаточно Структуры непосредственно в XML. Этот код должен начать вам:

package main 

import (
    "encoding/xml" 
    "fmt" 
) 

type Stats struct { 
    XMLName xml.Name 
    PageCount int `xml:"page-count,attr"` 
} 

type Meta struct { 
    XMLName xml.Name 
    Date string `xml:"creation-date"` 
    Title string `xml:"title"` 
    Stats Stats `xml:"document-statistic"` 
} 

type DocumentMeta struct { 
    XMLName xml.Name 
    Meta Meta `xml:"meta"` 
} 

var data = []byte(`<?xml version="1.0" encoding="UTF-8"?> 
<office:document-meta> 
    <office:meta> 
     <meta:creation-date>2016-10-18T15:05:19.137453293</meta:creation-date> 
     <dc:title>Document</dc:title> 
     <dc:date>2017-01-17T00:59:04.731054728</dc:date> 
     <meta:document-statistic meta:page-count="1" meta:word-count="0" meta:character-count="0"/> 
    </office:meta> 
</office:document-meta>`) 

func main() { 
    var dm DocumentMeta 
    xml.Unmarshal(data, &dm) 
    fmt.Println(dm) 
} 
Смежные вопросы