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:
jim teeuwen 2012-02-29 11:21:35 +01:00
parent ebbd6b3656
commit 817a15ca8b
2 changed files with 16 additions and 18 deletions

View File

@ -46,7 +46,6 @@ type Document struct {
StandAlone string // Value of XML doctype's 'standalone' attribute.
Entity map[string]string // Mapping of custom entity conversions.
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.
}
@ -58,7 +57,6 @@ func New() *Document {
StandAlone: "yes",
SaveDocType: true,
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.
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.Entity = this.Entity
xp.CharsetReader = this.CharsetReader
xp.CharsetReader = charset
this.Root = NewNode(NT_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.
func (this *Document) LoadBytes(d []byte) (err error) {
return this.LoadStream(bytes.NewBuffer(d))
func (this *Document) LoadBytes(d []byte, charset CharsetFunc) (err error) {
return this.LoadStream(bytes.NewBuffer(d), charset)
}
// Load the contents of this document from the supplied string.
func (this *Document) LoadString(s string) (err error) {
return this.LoadStream(strings.NewReader(s))
func (this *Document) LoadString(s string, charset CharsetFunc) (err error) {
return this.LoadStream(strings.NewReader(s), charset)
}
// 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
if fd, err = os.Open(filename); err != nil {
return
}
defer fd.Close()
return this.LoadStream(fd)
return this.LoadStream(fd, charset)
}
// 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
if r, err = http.Get(uri); err != nil {
return
}
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.

View File

@ -9,7 +9,7 @@ import "testing"
func TestLoadLocal(t *testing.T) {
doc := New()
if err := doc.LoadFile("test.xml"); err != nil {
if err := doc.LoadFile("test.xml", nil); err != nil {
t.Error(err.Error())
return
}
@ -23,7 +23,7 @@ func TestLoadLocal(t *testing.T) {
func TestWildcard(t *testing.T) {
doc := New()
if err := doc.LoadFile("test2.xml"); err != nil {
if err := doc.LoadFile("test2.xml", nil); err != nil {
t.Error(err.Error())
return
}
@ -39,7 +39,7 @@ func TestWildcard(t *testing.T) {
func _TestLoadRemote(t *testing.T) {
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())
return
}
@ -53,7 +53,7 @@ func _TestLoadRemote(t *testing.T) {
func TestSave(t *testing.T) {
doc := New()
if err := doc.LoadFile("test.xml"); err != nil {
if err := doc.LoadFile("test.xml", nil); err != nil {
t.Errorf("LoadFile(): %s", err)
return
}
@ -67,7 +67,7 @@ func TestSave(t *testing.T) {
func TestNodeSearch(t *testing.T) {
doc := New()
if err := doc.LoadFile("test1.xml"); err != nil {
if err := doc.LoadFile("test1.xml", nil); err != nil {
t.Errorf("LoadFile(): %s", err)
return
}
@ -95,7 +95,7 @@ type Image struct {
func TestUnmarshal(t *testing.T) {
doc := New()
err := doc.LoadFile("test1.xml")
err := doc.LoadFile("test1.xml", nil)
if err != nil {
t.Errorf("LoadFile(): %s", err)