我想知道是否可以使用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
方法。
我想知道是否可以使用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
方法。
只要得到它像所有其他屬性:
type App struct {
XS string `xml:"xs,attr"`
}
遊樂場:http://play.golang.org/p/2IOmkX1Jov。
如果你還有一個實際的xs
屬性,那麼它會變得更復雜,無法使用xmlns
。即使您將名稱空間URI添加到XS
的標記,您可能會get an error。
編輯:如果你想獲得所有聲明的名稱空間,您可以將元素定義自定義UnmarshalXML
和掃描它的屬性:
目前(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)
/* ... */
}
我不能預先推斷會有怎樣的前綴value.When你「混」 XML規範,使用前綴區分您正在使用的規格。我知道XMLSchema是使用指定的URI定義的。在算法中,我首先搜索一個名稱空間是否已被聲明,並且我想要檢索名稱空間前綴值。 – yageek
@yageek所以你想獲得關於所有聲明的名稱空間的信息?如果是這樣,請參閱編輯。 –
所以這是不可能的。 – yageek