簡體   English   中英

如何在XML文件中合並兩個不同的路徑?

[英]How to merge two different paths in a XML file?

這是我的xml文件:

   <File>
        <Paths>
                <Path>
                   <Node>
                      <NodeName>Initial_Node</NodeName>
                      <InnerNode>
                         <Signal>Test_sig</Signal>
                         <InnerNode>
                            <Signal>Test_sig_1</Signal>
                            <NodeRef>Ref0</NodeRef>
                         </InnerNode>
                      </InnerNode>
                   </Node>
                </Path>
                <Path>
                   <Node>
                      <NodeName>Name1</NodeName>
                      <InnerNode>
                         <Signal>Test_sig_0</Signal>
                         <InnerNode>
                            <Signal>Test_sig_2</Signal>
                            <NodeRef>Ref1</NodeRef>
                         </InnerNode>
                      </InnerNode>
                   </Node>
                </Path>
        </Paths>
        <Paths>
                <Path>
                   <Node>
                      <NodeRef>Ref0</NodeRef>
                      <InnerNode>
                         <Signal>Test_sig_3</Signal>
                         <InnerNode>
                            <Signal>Test_sig_4</Signal>
                            <NodeName>Final_Node</NodeName>
                         </InnerNode>
                      </InnerNode>
                   </Node>
                </Path>
        </Paths>
    </File>

我在Python中使用lxml。 我希望能夠在上面的文件中附加匹配的<NodeRef> ,然后將其余兩個匹配路徑合並在一起以得到以下結果:

 <File>
        <Paths>
                <Path>
                   <Node>
                      <NodeName>Initial_Node</NodeName>
                      <InnerNode>
                         <Signal>Test_sig</Signal>
                             <InnerNode>
                                <Signal>Test_sig_1</Signal>
                                    <InnerNode>
                                        <Signal>Test_sig_3</Signal>
                                        <InnerNode>
                                            <Signal>Test_sig_4</Signal>
                                            <NodeName>Final_Node</NodeName>
                                        </InnerNode>
                                    </InnerNode>
                             </InnerNode>
                      </InnerNode>
                   </Node>
                </Path>
                <Path>
                   <Node>
                      <NodeName>Name1</NodeName>
                      <InnerNode>
                         <Signal>Test_sig_0</Signal>
                         <InnerNode>
                            <Signal>Test_sig_2</Signal>
                            <NodeRef>Ref1</NodeRef>
                         </InnerNode>
                      </InnerNode>
                   </Node>
                </Path>
        </Paths>
    </File>

非常感謝您的幫助

因此,這里沒有太多細節可做,但這至少可以給出正確的輸出:

from lxml import etree
root = etree.fromstring(xml)

replace_set = {}
for node in root.iter("Node"):
    if 'NodeRef' in [c.tag for c in node]:
        # This is a <Node> type with child element <NodeRef>. So it will
        # be referenced by a <Node> with <NodeName>. Let's keep it, and then
        # remove it from the tree.
        ref = node.find("NodeRef").text
        inner = node.find("InnerNode")
        replace_set[ref] = inner
        # Remove NodeRef element, as we've saved it in dict
        node.getparent().remove(node)

# Cleanup where we've removed NodeRefs.
for node in root.iter("Paths"):
    if len(node.find("Path")) == 0:
        node.getparent().remove(node)

# Replace references to NodeRefs
for node in root.iter("NodeRef"):
    if node.text in replace_set:
        node.getparent().replace(node, replace_set[ref])

print etree.tostring(root)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM