Python 3.9基于lxml实现XML嵌套结构构建的问题咨询
嵌套XML结构构建与节点插入解决方案
问题背景
使用Python 3.9和lxml库,现有如下XML文档字符串:
payload_xml = """ <AllData> <MyPayload> ... ... ... </MyPayload> </AllData> """
需要构建一个父级XML,将上述MyPayload(忽略外层AllData)插入到目标XML的<Body>节点内,同时给<Header>添加指定嵌套子节点,目标结构如下:
<Full_Message prop1="" prop2=""> <Header> <headerValue1> </headerValue1> <headerValue2> </headerValue2> <headerValue3> </headerValue3> <NestedValues> <someval1> </someval1> </NestedValues> </Header> <Body> <!--Insert MyPayload xml string here ignoring AllData node--> </Body> </Full_Message>
当前代码执行后,MyPayload位于Full_Message根节点下而非Body内,且Header为空节点,需修正。
解决方案
1. 将MyPayload嵌套到Body节点内
不要直接把payload_only添加到根节点,先创建Body节点,再将payload_only追加到Body中。
2. 给Header添加嵌套子节点
通过etree.SubElement()方法,依次为Header创建各级子节点,包括嵌套的NestedValues及其子节点。
完整代码示例
from lxml import etree payload_xml = """ <AllData> <MyPayload> ... ... ... </MyPayload> </AllData> """ # 创建根节点并设置属性 FullMessage_root = etree.Element("Full_Message") FullMessage_root.attrib['prop1'] = 'hello world' FullMessage_root.attrib['prop2'] = 'some value' # 解析原payload并提取MyPayload AllData_root = etree.fromstring(payload_xml) payload_only = AllData_root[0] # 创建Header节点并添加子节点 header = etree.SubElement(FullMessage_root, "Header") # 添加Header的直接子节点 etree.SubElement(header, "headerValue1") etree.SubElement(header, "headerValue2") etree.SubElement(header, "headerValue3") # 创建NestedValues节点并添加其子节点 nested_values = etree.SubElement(header, "NestedValues") etree.SubElement(nested_values, "someval1") # 创建Body节点并插入MyPayload body = etree.SubElement(FullMessage_root, "Body") body.append(payload_only) # 输出格式化后的XML print(etree.tostring(FullMessage_root, pretty_print=True, encoding='unicode'))
执行结果
<Full_Message prop1="hello world" prop2="some value"> <Header> <headerValue1/> <headerValue2/> <headerValue3/> <NestedValues> <someval1/> </NestedValues> </Header> <Body> <MyPayload> ... ... ... </MyPayload> </Body> </Full_Message>
内容的提问来源于stack exchange,提问作者user20358
相关产品推荐
相关产品推荐

