我有一个路径和值列表,如下所示:
[
{'Path': 'Item/Info/Name', 'Value': 'Body HD'},
{'Path': 'Item/Genres/Genre', 'Value': 'Action'},
]
我想构建完整的xml结构,即:
<Item>
<Info>
<Name>Body HD</Name>
</Info>
<Genres>
<Genre>Action</Genre>
</Genres>
</Item>
有没有办法用lxml
执行此操作?或者我如何构建一个函数来填充推断的路径?
答案 0 :(得分:1)
是的,您可以使用if ! CMPOUT=`cmp -b f1 f2`; then
POS=`echo "$CMPOUT" | sed -r 's/^.*: byte ([0-9]+),.*$/\1/'`
echo -n '*' | dd of=f2 seek="$((POS-1))" bs=1 count=1 conv=notrunc
fi
。
我建议您使用模板XML并填充它。
模板:
$ cat f2
aaaaaaaaaaaaaaa*aaaaaaaaa
然后,填写它:
lxml
注意:而不是&#34; Path&#34;,我更愿意&#34; XPath&#34;
如果你不想要模板,你可以像这样生成整个树结构:
<Item>
<Info>
<Name/>
</Info>
<Genres>
<Genre/>
</Genres>
</Item>
from lxml import etree
tree = etree.parse("template.xml")
结果是:
entries = [
{'Path': 'Item/Info/Name', 'Value': 'Body HD'},
{'Path': 'Item/Genres/Genre', 'Value': 'Action'}]
for entry in entries:
xpath = entry["Path"]
node = tree.xpath(xpath)[0]
node.text = entry['Value']
当然,也有局限性。
答案 1 :(得分:1)
您可以执行以下操作:
l = [
{'Path': 'Item/Info/Name', 'Value': 'Body HD'},
{'Path': 'Item/Genres/Genre', 'Value': 'Action'},
]
import lxml.etree as et
root_node = l[0]["Path"].split("/", 1)[0]
tree = et.fromstring("<{}></{}>".format(root_node, root_node))
for dct in l:
nodes = iter(dct["Path"].split("/")[1:])
# catch path like Item/Foo where there is only one child.
nxt_child = child = et.Element(next(nodes))
for node in nodes:
# keep adding nodes
nxt_child = et.Element(node)
child.append(nxt_child)
# set value to last node.
nxt_child.text = dct["Value"]
# append it to the tree.
tree.append(child)
print(et.tostring(tree))
哪会给你:
<Item>
<Info>
<Name>Body HD</Name>
</Info>
<Genres>
<Genre>Action</Genre>
</Genres>
</Item>
您知道Item
是根节点,也是每个Path中的第一个节点,因此首先使用该节点创建一个树,然后只需添加到树中即可。