diff options
author | Christopher Brown <ccbrown112@gmail.com> | 2017-02-10 17:26:11 -0800 |
---|---|---|
committer | Brett Vickers <beevik@users.noreply.github.com> | 2017-02-10 17:32:03 -0800 |
commit | 1095c300fba68cb7f7895c0f96b2d34927f8115b (patch) | |
tree | 5a78e5dc1296c611818218c2723ee0e5e0ab3b20 | |
parent | b3ae4189aed37a6272bb3a6f40b00ca8d2198a14 (diff) | |
download | go-etree-1095c300fba68cb7f7895c0f96b2d34927f8115b.tar.gz |
Add Permissive read setting.
-rw-r--r-- | CONTRIBUTORS | 1 | ||||
-rw-r--r-- | etree.go | 11 | ||||
-rw-r--r-- | etree_test.go | 16 |
3 files changed, 25 insertions, 3 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS index ae44742..084662c 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -5,3 +5,4 @@ Graham King (grahamking) Matt Smith (ma314smith) Michal Jemala (michaljemala) Nicolas Piganeau (npiganeau) +Chris Brown (ccbrown) @@ -29,6 +29,10 @@ var ErrXML = errors.New("etree: invalid XML format") type ReadSettings struct { // CharsetReader to be passed to standard xml.Decoder. Default: nil. CharsetReader func(charset string, input io.Reader) (io.Reader, error) + + // Permissive allows input containing common mistakes such as missing tags + // or attribute values. Default: false. + Permissive bool } // newReadSettings creates a default ReadSettings record. @@ -171,7 +175,7 @@ func (d *Document) SetRoot(e *Element) { // ReadFrom reads XML from the reader r into the document d. It returns the // number of bytes read and any error encountered. func (d *Document) ReadFrom(r io.Reader) (n int64, err error) { - return d.Element.readFrom(r, d.ReadSettings.CharsetReader) + return d.Element.readFrom(r, d.ReadSettings) } // ReadFromFile reads XML from the string s into the document d. @@ -377,10 +381,11 @@ func (e *Element) RemoveChild(t Token) Token { // ReadFrom reads XML from the reader r and stores the result as a new child // of element e. -func (e *Element) readFrom(ri io.Reader, charsetReader func(charset string, input io.Reader) (io.Reader, error)) (n int64, err error) { +func (e *Element) readFrom(ri io.Reader, settings ReadSettings) (n int64, err error) { r := newCountReader(ri) dec := xml.NewDecoder(r) - dec.CharsetReader = charsetReader + dec.CharsetReader = settings.CharsetReader + dec.Strict = !settings.Permissive var stack stack stack.push(e) for { diff --git a/etree_test.go b/etree_test.go index f984d78..d3bd7aa 100644 --- a/etree_test.go +++ b/etree_test.go @@ -158,6 +158,22 @@ func TestDocumentRead_NonUTF8Encodings(t *testing.T) { } } +func TestDocumentRead_Permissive(t *testing.T) { + s := "<select disabled></select>" + + doc := NewDocument() + err := doc.ReadFromString(s) + if err == nil { + t.Fatal("etree: incorrect ReadFromString result") + } + + doc.ReadSettings.Permissive = true + err = doc.ReadFromString(s) + if err != nil { + t.Fatal("etree: incorrect ReadFromString result") + } +} + func TestWriteSettings(t *testing.T) { BOM := "\xef\xbb\xbf" |