Изменить данные в XML-файлах с помощью Golang - PullRequest
0 голосов
/ 01 мая 2018

Я хочу изменить поле lastModifiedBy с Тома Хэнкса на Джерри Гарсиа. Я использовал этот репозиторий: https://github.com/clbanning/mxj/blob/master/xml.go для разбора байтов xml на карту. Однако некоторые поля были опущены.

Какой простой способ изменить это поле и только это поле? Есть сотни этих файлов, поэтому мне нужно сделать это программно.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cp:coreProperties 
 xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core- 
 properties" xmlns:dc="http://purl.org/dc/elements/1.1/" 
 xmlns:dcterms="http://purl.org/dc/terms/" 
 xmlns:dcmitype="http://purl.org/dc/dcmitype/" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><dc:title></dc:title> 
<dc:subject></dc:subject><dc:creator>John Kerry</dc:creator> 
<cp:keywords></cp:keywords><dc:description></dc:description> 
<cp:lastModifiedBy>TomHanks</cp:lastModifiedBy><cp:revision>6</cp:revision> 
<dcterms:created xsi:type="dcterms:W3CDTF">2018-02- 
20T18:08:00Z</dcterms:created><dcterms:modified 
xsi:type="dcterms:W3CDTF">2018-04-24T19:43:00Z</dcterms:modified> 
</cp:coreProperties>

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

может быть, только тогда (самое простое, что работает), а затем после замены выполняется синтаксический анализ xml? Не уверен, действительно ли TomHanks => Jerry Garcia - это всегда одно и то же, или вы должны это параметризировать.

package main

import (
    "fmt"
    "strings"
)


var xmlRaw = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cp:coreProperties 
 xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core- 
 properties" xmlns:dc="http://purl.org/dc/elements/1.1/" 
 xmlns:dcterms="http://purl.org/dc/terms/" 
 xmlns:dcmitype="http://purl.org/dc/dcmitype/" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><dc:title></dc:title> 
<dc:subject></dc:subject><dc:creator>John Kerry</dc:creator> 
<cp:keywords></cp:keywords><dc:description></dc:description> 
<cp:lastModifiedBy>TomHanks</cp:lastModifiedBy><cp:revision>6</cp:revision> 
<dcterms:created xsi:type="dcterms:W3CDTF">2018-02- 
20T18:08:00Z</dcterms:created><dcterms:modified 
xsi:type="dcterms:W3CDTF">2018-04-24T19:43:00Z</dcterms:modified> 
</cp:coreProperties>`

type decoder struct {

}

func main() {

    fmt.Println(strings.Replace(xmlRaw, "TomHanks", "Jerry Garcia", 1))
}

https://play.golang.org/p/viTLElQxesM

это демонстрирует проблему, которую я описывал:

package main

import (
    "encoding/xml"
    "fmt"
)

var xmlRaw = []byte(`<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cp:coreProperties 
 xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core- 
 properties" xmlns:dc="http://purl.org/dc/elements/1.1/" 
 xmlns:dcterms="http://purl.org/dc/terms/" 
 xmlns:dcmitype="http://purl.org/dc/dcmitype/" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><dc:title></dc:title> 
<dc:subject></dc:subject><dc:creator>John Kerry</dc:creator> 
<cp:keywords></cp:keywords><dc:description></dc:description> 
<cp:lastModifiedBy>TomHanks</cp:lastModifiedBy><cp:revision>6</cp:revision> 
<dcterms:created xsi:type="dcterms:W3CDTF">2018-02- 
20T18:08:00Z</dcterms:created><dcterms:modified 
xsi:type="dcterms:W3CDTF">2018-04-24T19:43:00Z</dcterms:modified> 
</cp:coreProperties>`)

type decoder struct {
    Keywords       string `xml:"keywords"`
    LastModifiedBy string `xml:"lastModifiedBy"`
    //.. more xml
}

func main() {
    d := decoder{}
    if err := xml.Unmarshal(xmlRaw, &d); err != nil {
        panic(err)
    }
    fmt.Println(d.LastModifiedBy)
    d.LastModifiedBy = "Jerry Garcia"
    bytes, err := xml.Marshal(d)
    if err != nil {
        panic(err)
    }

    fmt.Println(string(bytes))

}

https://play.golang.org/p/aYa01_3UE5e

Выход:

TomHanks

<decoder><keywords></keywords><lastModifiedBy>Jerry Garcia</lastModifiedBy></decoder>
0 голосов
/ 01 мая 2018
<cp:lastModifiedBy>JerryGarcia</cp:lastModifiedBy><cp:revision>6</cp:revision> 

Удалите TomHanks и напишите JerryGarcia

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...