diff --git a/virtinst/xmlbuilder.py b/virtinst/xmlbuilder.py index 228d41bbb..039662e63 100644 --- a/virtinst/xmlbuilder.py +++ b/virtinst/xmlbuilder.py @@ -167,6 +167,16 @@ def _build_xpath_node(ctx, xpath): And the node pointing to @baz will be returned, for the caller to do with as they please. + + There's also special handling to ensure that setting + xpath=./bar[@baz='foo']/frob will create + + + + + + Even if didn't exist before. So we fill in the dependent property + expression values """ def _handle_node(nodename, parentnode, parentpath): # If the passed xpath snippet (nodename) exists, return the node @@ -209,6 +219,19 @@ def _build_xpath_node(ctx, xpath): for nodename in xpath.split("/"): parentnode, parentpath = _handle_node(nodename, parentnode, parentpath) + # Check if the xpath snippet had an '=' expression in it, example: + # + # ./foo[@bar='baz'] + # + # If so, we also want to set , so that setting + # this XML element works as expected in this case. + if "[" not in nodename or "=" not in nodename: + continue + + propname, val = nodename.split("[")[1].strip("]").split("=") + propobj, ignore = _handle_node(propname, parentnode, parentpath) + propobj.setContent(val.strip("'")) + return parentnode