| 542 | } |
| 543 | |
| 544 | func (d *Decoder) rawToken() (Token, error) { |
| 545 | if d.t != nil { |
| 546 | return d.t.Token() |
| 547 | } |
| 548 | if d.err != nil { |
| 549 | return nil, d.err |
| 550 | } |
| 551 | if d.needClose { |
| 552 | // The last element we read was self-closing and |
| 553 | // we returned just the StartElement half. |
| 554 | // Return the EndElement half now. |
| 555 | d.needClose = false |
| 556 | return EndElement{d.toClose}, nil |
| 557 | } |
| 558 | |
| 559 | b, ok := d.getc() |
| 560 | if !ok { |
| 561 | return nil, d.err |
| 562 | } |
| 563 | |
| 564 | if b != '<' { |
| 565 | // Text section. |
| 566 | d.ungetc(b) |
| 567 | data := d.text(-1, false) |
| 568 | if data == nil { |
| 569 | return nil, d.err |
| 570 | } |
| 571 | return CharData(data), nil |
| 572 | } |
| 573 | |
| 574 | if b, ok = d.mustgetc(); !ok { |
| 575 | return nil, d.err |
| 576 | } |
| 577 | switch b { |
| 578 | case '/': |
| 579 | // </: End element |
| 580 | var name Name |
| 581 | if name, ok = d.nsname(); !ok { |
| 582 | if d.err == nil { |
| 583 | d.err = d.syntaxError("expected element name after </") |
| 584 | } |
| 585 | return nil, d.err |
| 586 | } |
| 587 | d.space() |
| 588 | if b, ok = d.mustgetc(); !ok { |
| 589 | return nil, d.err |
| 590 | } |
| 591 | if b != '>' { |
| 592 | d.err = d.syntaxError("invalid characters between </" + name.Local + " and >") |
| 593 | return nil, d.err |
| 594 | } |
| 595 | return EndElement{name}, nil |
| 596 | |
| 597 | case '?': |
| 598 | // <?: Processing instruction. |
| 599 | var target string |
| 600 | if target, ok = d.name(); !ok { |
| 601 | if d.err == nil { |