@@ -2809,6 +2809,70 @@ private module StdlibPrivate {
28092809 override string getKind ( ) { result = Escaping:: getRegexKind ( ) }
28102810 }
28112811
2812+ // ---------------------------------------------------------------------------
2813+ // xml.etree.ElementTree
2814+ // ---------------------------------------------------------------------------
2815+ /**
2816+ * An instance of `xml.etree.ElementTree.ElementTree`.
2817+ *
2818+ * See https://docs.python.org/3.10/library/xml.etree.elementtree.html#xml.etree.ElementTree.ElementTree
2819+ */
2820+ private API:: Node elementTreeInstance ( ) {
2821+ //parse to a tree
2822+ result =
2823+ API:: moduleImport ( "xml" )
2824+ .getMember ( "etree" )
2825+ .getMember ( "ElementTree" )
2826+ .getMember ( "parse" )
2827+ .getReturn ( )
2828+ or
2829+ // construct a tree without parsing
2830+ result =
2831+ API:: moduleImport ( "xml" )
2832+ .getMember ( "etree" )
2833+ .getMember ( "ElementTree" )
2834+ .getMember ( "ElementTree" )
2835+ .getReturn ( )
2836+ }
2837+
2838+ /**
2839+ * An instance of `xml.etree.ElementTree.Element`.
2840+ *
2841+ * See https://docs.python.org/3.10/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element
2842+ */
2843+ private API:: Node elementInstance ( ) {
2844+ // parse or go to the root of a tree
2845+ result = elementTreeInstance ( ) .getMember ( [ "parse" , "getroot" ] ) .getReturn ( )
2846+ or
2847+ // parse directly to an element
2848+ result =
2849+ API:: moduleImport ( "xml" )
2850+ .getMember ( "etree" )
2851+ .getMember ( "ElementTree" )
2852+ .getMember ( [ "fromstring" , "fromstringlist" , "XML" ] )
2853+ .getReturn ( )
2854+ }
2855+
2856+ /**
2857+ * A call to a find method on a tree or an element will execute an XPath expression.
2858+ */
2859+ private class ElementTreeFindCall extends XPathExecution:: Range , DataFlow:: CallCfgNode {
2860+ string methodName ;
2861+
2862+ ElementTreeFindCall ( ) {
2863+ methodName in [ "find" , "findall" , "findtext" ] and
2864+ (
2865+ this = elementTreeInstance ( ) .getMember ( methodName ) .getACall ( )
2866+ or
2867+ this = elementInstance ( ) .getMember ( methodName ) .getACall ( )
2868+ )
2869+ }
2870+
2871+ override DataFlow:: Node getXPath ( ) { result in [ this .getArg ( 0 ) , this .getArgByName ( "match" ) ] }
2872+
2873+ override string getName ( ) { result = "xml.etree" }
2874+ }
2875+
28122876 // ---------------------------------------------------------------------------
28132877 // urllib
28142878 // ---------------------------------------------------------------------------
0 commit comments