diff options
author | Cole Robinson <crobinso@redhat.com> | 2016-07-18 14:40:58 -0400 |
---|---|---|
committer | Cole Robinson <crobinso@redhat.com> | 2016-07-18 14:46:50 -0400 |
commit | b08647c2f277e463971ae1e4430aaed28a4619f3 (patch) | |
tree | 342d158310b046e8f86f5e2006847abe1a3f8a37 /virtinst/xmlbuilder.py | |
parent | 835ddc5f7710d195a8d069358693712e68f2b353 (diff) | |
download | virt-manager-b08647c2f277e463971ae1e4430aaed28a4619f3.tar.gz |
xmlbuilder: Handle setting conditional xpaths correctly
So if xml=<foo> and xpath=./bar[@baz='foo'] and val=XXX, xmlbuilder
previously would generate XML
<foo>
<bar>XXX</bar>
</foo>
But now generates the expected
<foo>
<bar baz='foo'/>XXX</bar>
</foo>
No users yet, but they are incoming
Diffstat (limited to 'virtinst/xmlbuilder.py')
-rw-r--r-- | virtinst/xmlbuilder.py | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/virtinst/xmlbuilder.py b/virtinst/xmlbuilder.py index 228d41bb..039662e6 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 + + <bar baz='foo'> + <frob></frob> + </bar> + + Even if <bar> 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 <foo bar='baz'/>, 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 |