用路径和值写xml

时间:2016-08-16 19:38:20

标签: python xml lxml elementtree

我有一个路径和值列表,如下所示:

[
  {'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执行此操作?或者我如何构建一个函数来填充推断的路径?

2 个答案:

答案 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中的第一个节点,因此首先使用该节点创建一个树,然后只需添加到树中即可。