aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Brown <ccbrown112@gmail.com>2017-02-10 17:26:11 -0800
committerBrett Vickers <beevik@users.noreply.github.com>2017-02-10 17:32:03 -0800
commit1095c300fba68cb7f7895c0f96b2d34927f8115b (patch)
tree5a78e5dc1296c611818218c2723ee0e5e0ab3b20
parentb3ae4189aed37a6272bb3a6f40b00ca8d2198a14 (diff)
downloadgo-etree-1095c300fba68cb7f7895c0f96b2d34927f8115b.tar.gz
Add Permissive read setting.
-rw-r--r--CONTRIBUTORS1
-rw-r--r--etree.go11
-rw-r--r--etree_test.go16
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)
diff --git a/etree.go b/etree.go
index 21f8352..36b279f 100644
--- a/etree.go
+++ b/etree.go
@@ -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"