gpt4 book ai didi

python - 使用 lxml 添加 namespace 与根元素不同的 xml 子元素

转载 作者:行者123 更新时间:2023-12-04 17:05:53 41 4
gpt4 key购买 nike

这是我正在尝试构建的 xml 的简化版本:

<BizData xmlns="urn:iso:std:iso:20022:tech:xsd:head.003.001.01" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:n1="urn:iso:std:iso:20022:tech:xsd:head.001.001.02"
xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:head.003.001.01 head.003.001.02_DTCC.xsd">
<Hdr>
<AppHdr xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.02"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:head.001.001.02 head.001.001.02.xsd">
</AppHdr>
</Hdr>
</BizData>

Python代码
from lxml import etree as etree

if __name__ == '__main__':
attr_qname = etree.QName('http://www.w3.org/2001/XMLSchema-instance', 'schemaLocation')
nsmap = {None: 'urn:iso:std:iso:20022:tech:xsd:head.003.001.01',
'xsi': 'http://www.w3.org/2001/XMLSchema-instance',
'n1': 'urn:iso:std:iso:20022:tech:xsd:head.001.001.02'
}
root = etree.Element('BizData',
{attr_qname: 'urn:iso:std:iso:20022:tech:xsd:head.003.001.01 head.003.001.02_DTCC.xsd'},
nsmap)

hdr = etree.Element('hdr')
attr_qname = etree.QName('http://www.w3.org/2001/XMLSchema-instance', 'schemaLocation')
nsmap = {None: 'urn:iso:std:iso:20022:tech:xsd:head.001.001.02',
'xsi': 'http://www.w3.org/2001/XMLSchema-instance',
}

app_hdr = etree.Element('AppHdr',
{attr_qname: 'urn:iso:std:iso:20022:tech:xsd:head.001.001.02 head.001.001.02.xsd'},
nsmap)
hdr.append(app_hdr)
root.append(hdr)

打印时 hdr在附加到根之前,我得到了正确的输出:
<Hdr>
<AppHdr xmlns="urn:iso:std:iso:20022:tech:xsd:head.001.001.02"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:head.001.001.02 head.001.001.02.xsd">
</AppHdr>
</Hdr>

但是在附加到 root 命名空间后 xmlnsxmlns:xsi消失:
<BizData xmlns:n1="urn:iso:std:iso:20022:tech:xsd:head.001.001.02" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="urn:iso:std:iso:20022:tech:xsd:head.003.001.01"
xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:head.003.001.01 head.003.001.02_DTCC.xsd">
<hdr>
<AppHdr xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:head.001.001.02 head.001.001.02.xsd"/>
</hdr>
</BizData>

我尝试使用 set设置函数 xmlns:xsi但这会导致错误 ..not a valid attribute...
有人有想法吗?

最佳答案

肮脏的解决方法

  • 创建信封 ( BizData )、标题 ( Hdr ) 和有效负载 ( Pyld ) 作为个人 etree.Element
  • 将它们转移到字符串
  • 组合字符串
  • 写入 xml 文件

  • 这忽略了任何类型的验证,但不会弄乱命名空间。不理想,但可以完成工作。

    关于python - 使用 lxml 添加 namespace 与根元素不同的 xml 子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61085581/

    41 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com