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