Remove CharsetFunc as field for Document type and instead supply it as a parameter for all Document.LoadXXX methods. There should be no need to store the function pointer in the Document struct.
This commit is contained in:
parent
ebbd6b3656
commit
817a15ca8b
22
document.go
22
document.go
|
@ -46,7 +46,6 @@ type Document struct {
|
||||||
StandAlone string // Value of XML doctype's 'standalone' attribute.
|
StandAlone string // Value of XML doctype's 'standalone' attribute.
|
||||||
Entity map[string]string // Mapping of custom entity conversions.
|
Entity map[string]string // Mapping of custom entity conversions.
|
||||||
Root *Node // The document's root node.
|
Root *Node // The document's root node.
|
||||||
CharsetReader CharsetFunc // Override the xml decoder's CharsetReader. Defaults to nil.
|
|
||||||
SaveDocType bool // Whether not to include the XML doctype in saves.
|
SaveDocType bool // Whether not to include the XML doctype in saves.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,7 +57,6 @@ func New() *Document {
|
||||||
StandAlone: "yes",
|
StandAlone: "yes",
|
||||||
SaveDocType: true,
|
SaveDocType: true,
|
||||||
Entity: make(map[string]string),
|
Entity: make(map[string]string),
|
||||||
CharsetReader: nil,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,10 +80,10 @@ func (this *Document) SelectNodes(namespace, name string) []*Node {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load the contents of this document from the supplied reader.
|
// Load the contents of this document from the supplied reader.
|
||||||
func (this *Document) LoadStream(r io.Reader) (err error) {
|
func (this *Document) LoadStream(r io.Reader, charset CharsetFunc) (err error) {
|
||||||
xp := xml.NewDecoder(r)
|
xp := xml.NewDecoder(r)
|
||||||
xp.Entity = this.Entity
|
xp.Entity = this.Entity
|
||||||
xp.CharsetReader = this.CharsetReader
|
xp.CharsetReader = charset
|
||||||
|
|
||||||
this.Root = NewNode(NT_ROOT)
|
this.Root = NewNode(NT_ROOT)
|
||||||
ct := this.Root
|
ct := this.Root
|
||||||
|
@ -151,35 +149,35 @@ func (this *Document) LoadStream(r io.Reader) (err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load the contents of this document from the supplied byte slice.
|
// Load the contents of this document from the supplied byte slice.
|
||||||
func (this *Document) LoadBytes(d []byte) (err error) {
|
func (this *Document) LoadBytes(d []byte, charset CharsetFunc) (err error) {
|
||||||
return this.LoadStream(bytes.NewBuffer(d))
|
return this.LoadStream(bytes.NewBuffer(d), charset)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load the contents of this document from the supplied string.
|
// Load the contents of this document from the supplied string.
|
||||||
func (this *Document) LoadString(s string) (err error) {
|
func (this *Document) LoadString(s string, charset CharsetFunc) (err error) {
|
||||||
return this.LoadStream(strings.NewReader(s))
|
return this.LoadStream(strings.NewReader(s), charset)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load the contents of this document from the supplied file.
|
// Load the contents of this document from the supplied file.
|
||||||
func (this *Document) LoadFile(filename string) (err error) {
|
func (this *Document) LoadFile(filename string, charset CharsetFunc) (err error) {
|
||||||
var fd *os.File
|
var fd *os.File
|
||||||
if fd, err = os.Open(filename); err != nil {
|
if fd, err = os.Open(filename); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
defer fd.Close()
|
defer fd.Close()
|
||||||
return this.LoadStream(fd)
|
return this.LoadStream(fd, charset)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load the contents of this document from the supplied uri.
|
// Load the contents of this document from the supplied uri.
|
||||||
func (this *Document) LoadUri(uri string) (err error) {
|
func (this *Document) LoadUri(uri string, charset CharsetFunc) (err error) {
|
||||||
var r *http.Response
|
var r *http.Response
|
||||||
if r, err = http.Get(uri); err != nil {
|
if r, err = http.Get(uri); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
defer r.Body.Close()
|
defer r.Body.Close()
|
||||||
return this.LoadStream(r.Body)
|
return this.LoadStream(r.Body, charset)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Save the contents of this document to the supplied file.
|
// Save the contents of this document to the supplied file.
|
||||||
|
|
12
xmlx_test.go
12
xmlx_test.go
|
@ -9,7 +9,7 @@ import "testing"
|
||||||
func TestLoadLocal(t *testing.T) {
|
func TestLoadLocal(t *testing.T) {
|
||||||
doc := New()
|
doc := New()
|
||||||
|
|
||||||
if err := doc.LoadFile("test.xml"); err != nil {
|
if err := doc.LoadFile("test.xml", nil); err != nil {
|
||||||
t.Error(err.Error())
|
t.Error(err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,7 @@ func TestLoadLocal(t *testing.T) {
|
||||||
func TestWildcard(t *testing.T) {
|
func TestWildcard(t *testing.T) {
|
||||||
doc := New()
|
doc := New()
|
||||||
|
|
||||||
if err := doc.LoadFile("test2.xml"); err != nil {
|
if err := doc.LoadFile("test2.xml", nil); err != nil {
|
||||||
t.Error(err.Error())
|
t.Error(err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -39,7 +39,7 @@ func TestWildcard(t *testing.T) {
|
||||||
func _TestLoadRemote(t *testing.T) {
|
func _TestLoadRemote(t *testing.T) {
|
||||||
doc := New()
|
doc := New()
|
||||||
|
|
||||||
if err := doc.LoadUri("http://blog.golang.org/feeds/posts/default"); err != nil {
|
if err := doc.LoadUri("http://blog.golang.org/feeds/posts/default", nil); err != nil {
|
||||||
t.Error(err.Error())
|
t.Error(err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ func _TestLoadRemote(t *testing.T) {
|
||||||
func TestSave(t *testing.T) {
|
func TestSave(t *testing.T) {
|
||||||
doc := New()
|
doc := New()
|
||||||
|
|
||||||
if err := doc.LoadFile("test.xml"); err != nil {
|
if err := doc.LoadFile("test.xml", nil); err != nil {
|
||||||
t.Errorf("LoadFile(): %s", err)
|
t.Errorf("LoadFile(): %s", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -67,7 +67,7 @@ func TestSave(t *testing.T) {
|
||||||
func TestNodeSearch(t *testing.T) {
|
func TestNodeSearch(t *testing.T) {
|
||||||
doc := New()
|
doc := New()
|
||||||
|
|
||||||
if err := doc.LoadFile("test1.xml"); err != nil {
|
if err := doc.LoadFile("test1.xml", nil); err != nil {
|
||||||
t.Errorf("LoadFile(): %s", err)
|
t.Errorf("LoadFile(): %s", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -95,7 +95,7 @@ type Image struct {
|
||||||
|
|
||||||
func TestUnmarshal(t *testing.T) {
|
func TestUnmarshal(t *testing.T) {
|
||||||
doc := New()
|
doc := New()
|
||||||
err := doc.LoadFile("test1.xml")
|
err := doc.LoadFile("test1.xml", nil)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("LoadFile(): %s", err)
|
t.Errorf("LoadFile(): %s", err)
|
||||||
|
|
Loading…
Reference in New Issue