From 00f2e4a8c5f80c7c63c24e42ca4e8311b39c6952 Mon Sep 17 00:00:00 2001 From: Subhomoy Haldar Date: Fri, 10 Nov 2023 09:31:36 +0000 Subject: [PATCH] encoding.xml: make tag name and attribute parsing more robust and cleaner (#19828) --- vlib/encoding/xml/parser.v | 20 ++++++------------- .../local/18_single_letter_tag/shared.xml | 2 +- .../local/18_single_letter_tag/shared_test.v | 3 +++ 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/vlib/encoding/xml/parser.v b/vlib/encoding/xml/parser.v index 7ba34909ec..51d0a0cf60 100644 --- a/vlib/encoding/xml/parser.v +++ b/vlib/encoding/xml/parser.v @@ -527,20 +527,12 @@ fn parse_children(name string, attributes map[string]string, mut reader io.Reade } fn parse_single_node(first_char u8, mut reader io.Reader) !XMLNode { - mut local_buf := [u8(0)] - mut ch := next_char(mut reader, mut local_buf)! mut contents := strings.new_builder(xml.default_string_builder_cap) - // We're expecting an opening tag - if ch == `/` { - return error('XML node cannot start with "` { - contents.write_u8(ch) - } - - for ch != `>` { - ch = next_char(mut reader, mut local_buf)! + mut local_buf := [u8(0)] + for { + mut ch := next_char(mut reader, mut local_buf)! if ch == `>` { break } @@ -550,7 +542,7 @@ fn parse_single_node(first_char u8, mut reader io.Reader) !XMLNode { tag_contents := contents.str().trim_space() parts := tag_contents.split_any(' \t\n') - name := if parts.len > 0 { first_char.ascii_str() + parts[0] } else { first_char.ascii_str() } + name := parts[0] // Check if it is a self-closing tag if tag_contents.ends_with('/') { @@ -561,7 +553,7 @@ fn parse_single_node(first_char u8, mut reader io.Reader) !XMLNode { } } - attribute_string := tag_contents[name.len - 1..].trim_space() + attribute_string := tag_contents[name.len..].trim_space() attributes := parse_attributes(attribute_string)! return parse_children(name, attributes, mut reader) diff --git a/vlib/encoding/xml/test/local/18_single_letter_tag/shared.xml b/vlib/encoding/xml/test/local/18_single_letter_tag/shared.xml index 6027b6eb6b..74f2ecce02 100644 --- a/vlib/encoding/xml/test/local/18_single_letter_tag/shared.xml +++ b/vlib/encoding/xml/test/local/18_single_letter_tag/shared.xml @@ -1,7 +1,7 @@ - Item 1 + Item 1 Item 2 diff --git a/vlib/encoding/xml/test/local/18_single_letter_tag/shared_test.v b/vlib/encoding/xml/test/local/18_single_letter_tag/shared_test.v index 41416a99c5..f86d895385 100644 --- a/vlib/encoding/xml/test/local/18_single_letter_tag/shared_test.v +++ b/vlib/encoding/xml/test/local/18_single_letter_tag/shared_test.v @@ -19,6 +19,9 @@ fn test_valid_parsing() { children: [ xml.XMLNode{ name: 't' + attributes: { + 'a': '1' + } children: ['Item 1'] }, ]