module dom
import parser
+
+redef class XMLEntity
+
+ # The `XMLTag` children with the `tag_name`
+ #
+ # ~~~
+ # var code = """
+ # <?xml version="1.0" encoding="us-ascii"?>
+ # <animal>
+ # <cat/>
+ # <tiger>This is a white tiger!</tiger>
+ # <cat/>
+ # </animal>"""
+ #
+ # var xml = code.to_xml
+ # assert xml["animal"].length == 1
+ # assert xml["animal"].first["cat"].length == 2
+ # ~~~
+ fun [](tag_name: String): Array[XMLTag]
+ do
+ var res = new Array[XMLTag]
+ for child in children do
+ if child isa XMLTag and child.tag_name == tag_name then
+ res.add child
+ end
+ end
+ return res
+ end
+end
+
+redef class XMLStartTag
+
+ # Content of this XML tag held within a `PCDATA` or `CDATA`
+ #
+ # ~~~
+ # var code = """
+ # <?xml version="1.0" encoding="us-ascii"?>
+ # <animal>
+ # <cat/>
+ # <tiger>This is a white tiger!</tiger>
+ # <cat/>
+ # </animal>"""
+ #
+ # var xml = code.to_xml
+ # assert xml["animal"].first["tiger"].first.as(XMLStartTag).data == "This is a white tiger!"
+ # ~~~
+ fun data: String
+ do
+ for child in children do
+ if child isa PCDATA then return child.content
+ if child isa CDATA then return child.content
+ end
+ abort
+ end
+end
+
+redef class XMLAttrTag
+
+ # Attributes as a map (ignoring malformed attributes)
+ #
+ # ~~~
+ # var xml = """
+ # <student first="Snow" last="Man"/>
+ # """.to_xml
+ #
+ # var attributes = xml["student"].first.as(XMLAttrTag).attributes_to_map
+ # assert attributes.join(", ", ":") == "first:Snow, last:Man"
+ # ~~~
+ fun attributes_to_map: Map[String, String]
+ do
+ var m = new Map[String, String]
+ for a in attributes do
+ if a isa XMLStringAttr then
+ m[a.name] = a.value
+ end
+ end
+ return m
+ end
+end