2016-01-27 93 views
2

我想知道是否可以使用encoding/xml中的 Unmarshal方法獲取XML名稱空間前綴。使用Unmarshal在Go中獲取XML名稱空間前綴

例如,我有:

<application xmlns="http://wadl.dev.java.net/2009/02" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
</application> 

我想知道如何檢索xs定義XMLSchema的前綴,而不必使用Token方法。

回答

2

只要得到它像所有其他屬性:

type App struct { 
    XS string `xml:"xs,attr"` 
} 

遊樂場:http://play.golang.org/p/2IOmkX1Jov

如果你還有一個實際的xs屬性,那麼它會變得更復雜,無法使用xmlns。即使您將名稱空間URI添加到XS的標記,您可能會get an error

編輯:如果你想獲得所有聲明的名稱空間,您可以將元素定義自定義UnmarshalXML和掃描它的屬性:

​​

遊樂場:http://play.golang.org/p/u4RJBG3_jW

+0

我不能預先推斷會有怎樣的前綴value.When你「混」 XML規範,使用前綴區分您正在使用的規格。我知道XMLSchema是使用指定的URI定義的。在算法中,我首先搜索一個名稱空間是否已被聲明,並且我想要檢索名稱空間前綴值。 – yageek

+0

@yageek所以你想獲得關於所有聲明的名稱空間的信息?如果是這樣,請參閱編輯。 –

+0

所以這是不可能的。 – yageek

0

目前(Go 1.5),它似乎不可能。

我發現的唯一的解決辦法,是使用倒帶元素:

func NewDocument(r io.ReadSeeker) (*Document, error) { 

    decoder := xml.NewDecoder(r) 

    // Retrieve xml namespace first 
    rootToken, err := decoder.Token() 


    if err != nil { 
     return nil, err 
    } 

    var xmlSchemaNamespace string 

    switch element := rootToken.(type) { 
    case xml.StartElement: 

     for _, attr := range element.Attr { 
      if attr.Value == xsd.XMLSchemaURI { 
       xmlSchemaNamespace = attr.Name.Local 
       break 
      } 
     } 
    } 

    /* Process name space */ 

    // Rewind 
    r.Seek(0, 0) 

    // Standart unmarshall 
    decoder = xml.NewDecoder(r) 
    err = decoder.Decode(&w) 

    /* ... */ 
} 
相關問題