2016-09-07 9 views
1

個別の<order/>要素のリストを含むXMLファイルがあります。この1つのXMLファイルを複数のファイルに分割したいと思います。それぞれのファイルには1つのオーダーが含まれています。サブ要素の外側XMLを保持するにはどうすればよいですか?

例入力ファイル:

<orders> 
    <order order-id="123"> 
    <line-item product-id="ABC">ABC</line-item> 
    </order> 
    <order order-id="456"> 
    <line-item product-id="DEF">DEF</line-item> 
    </order> 
</orders> 

理想出力:

オーダー123.xml:

<order order-id="123"> 
    <line-item product-id="ABC">ABC</line-item> 
</order> 

オーダー456.xml:

<order order-id="456"> 
    <line-item product-id="DEF">DEF</line-item> 
</order> 

この段階では、各注文の詳細を構造体にアンマーシャリングすることには関係しません。私はそれぞれのファイルの正確なコピーをそれぞれの<order/>ノードに入れたいだけです。

Iは、xml:",innerxml"like thisを使用して、この数のバリエーションを試してみました:

type OrdersRaw struct { 
    Orders []OrderRaw `xml:"order"` 
} 

type OrderRaw struct { 
    Order string `xml:",innerxml"` 
} 

上記のコードでの問題は、各Order値は、内側XML(<line-item/>始まる)を含むが、ラッピングを含まないことです<order/>タグ。

xml:",outerxml"タグがあれば理想的です。

手書きのXML(例:<order order-id="123">)で内側のXMLを手作業で連結するような嫌なことは避けようとしています。あなたのOrderRaw

+0

regexpだけで実行できるようです。 – Uvelichitel

+1

正規表現によるXMLの解析?ただあなたが_can_あなたが_should_を意味するわけではありません。私は[そのようなハックなソリューション](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454)を避けようとしています。 –

+0

シンプルなケースでは、regexpはXML Encoder Decoderパイプよりも速くて読みやすくなります – Uvelichitel

答えて

2

使用XMLName

type OrderRaw struct { 
    XMLName xml.Name `xml:"order"` 
    Order string `xml:",innerxml"` 
    OrderID string `xml:"order-id,attr"` 
} 

遊び場:https://play.golang.org/p/onK5FExqzD


EDIT:

func (o *OrderRaw) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { 
    o.attrs = map[xml.Name]string{} 
    for _, a := range start.Attr { 
     o.attrs[a.Name] = a.Value 
    } 
    type order OrderRaw 
    return d.DecodeElement((*order)(o), &start) 
} 

func (o OrderRaw) MarshalXML(e *xml.Encoder, start xml.StartElement) error { 
    for name, attr := range o.attrs { 
     start.Attr = append(start.Attr, xml.Attr{Name: name, Value: attr}) 
    } 
    start.Name = xml.Name{Local: "order"} 
    type order OrderRaw 
    return e.EncodeElement(order(o), start) 
} 

遊び場::https://play.golang.org/p/XhkwqJFyMdあなたがすべての属性を保存したい場合はは、あなたがMarshalerXMLUnmarshalerXMLインタフェースを使用する必要があります。

+0

ありがとう、それは近いですが、属性が追加された場合に各オーダーの完全なxmlをキャプチャするソリューションを期待しています私の知識がなくても将来的にはorder-id = "123" foo = "bar" /> ') –

+0

@ChadGilbert編集を参照してください。 –

+0

ありがとう!それはトリックです! –

関連する問題