aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrett Vickers <brett@beevik.com>2018-10-05 16:44:49 -0700
committerBrett Vickers <brett@beevik.com>2018-10-05 16:52:11 -0700
commit9750b0e2ad288eec0bc888d39b890f47849bf883 (patch)
tree159e0389af58641b6ac83b8984b4515137cb0e94
parent90dafc1e1f114dfb9576218bb43c03fb854d1b34 (diff)
downloadgo-etree-9750b0e2ad288eec0bc888d39b890f47849bf883.tar.gz
Fix a bug in text processing.
This fixes issue https://github.com/beevik/etree/issues/54
-rw-r--r--etree.go16
-rw-r--r--etree_test.go26
2 files changed, 39 insertions, 3 deletions
diff --git a/etree.go b/etree.go
index 7440eb7..d519477 100644
--- a/etree.go
+++ b/etree.go
@@ -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>