diff options
author | Brett Vickers <brett@beevik.com> | 2018-10-05 16:44:49 -0700 |
---|---|---|
committer | Brett Vickers <brett@beevik.com> | 2018-10-05 16:52:11 -0700 |
commit | 9750b0e2ad288eec0bc888d39b890f47849bf883 (patch) | |
tree | 159e0389af58641b6ac83b8984b4515137cb0e94 | |
parent | 90dafc1e1f114dfb9576218bb43c03fb854d1b34 (diff) | |
download | go-etree-9750b0e2ad288eec0bc888d39b890f47849bf883.tar.gz |
Fix a bug in text processing.
This fixes issue https://github.com/beevik/etree/issues/54
-rw-r--r-- | etree.go | 16 | ||||
-rw-r--r-- | etree_test.go | 26 |
2 files changed, 39 insertions, 3 deletions
@@ -307,10 +307,20 @@ func (e *Element) Text() string { if len(e.Child) == 0 { return "" } - if cd, ok := e.Child[0].(*CharData); ok { - return cd.Data + + text := "" + for _, ch := range e.Child { + if cd, ok := ch.(*CharData); ok { + if text == "" { + text = cd.Data + } else { + text = text + cd.Data + } + } else { + break + } } - return "" + return text } // SetText replaces an element's subsidiary CharData text with a new string. diff --git a/etree_test.go b/etree_test.go index 90a347c..44c05a8 100644 --- a/etree_test.go +++ b/etree_test.go @@ -389,6 +389,32 @@ func TestInsertChild(t *testing.T) { checkEq(t, s4, expected4) } +func TestCdata(t *testing.T) { + var tests = []struct { + in, out string + }{ + {`<tag>1234567</tag>`, "1234567"}, + {`<tag><![CDATA[1234567]]></tag>`, "1234567"}, + {`<tag>1<![CDATA[2]]>3<![CDATA[4]]>5<![CDATA[6]]>7</tag>`, "1234567"}, + {`<tag>1<![CDATA[2]]>3<inner>4</inner>5<![CDATA[6]]>7</tag>`, "123"}, + {`<tag>1<inner>4</inner>5<![CDATA[6]]>7</tag>`, "1"}, + {`<tag><![CDATA[1]]><inner>4</inner>5<![CDATA[6]]>7</tag>`, "1"}, + } + + for _, test := range tests { + doc := NewDocument() + err := doc.ReadFromString(test.in) + if err != nil { + t.Fatal("etree ReadFromString: " + err.Error()) + } + + tag := doc.FindElement("tag") + if tag.Text() != test.out { + t.Fatalf("etree invalid cdata. Expected: %v. Got: %v\n", test.out, tag.Text()) + } + } +} + func TestAddChild(t *testing.T) { testdoc := `<book lang="en"> <t:title>Great Expectations</t:title> |