我手动创建xml,然后尝试使用xsd scheme验证它。验证最初没有通过,但如果我将xml转换为字符串并返回 - 那么新的xml将通过验证。
from lxml import etree
xsd = etree.fromstring("""
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="some_namespace">
<element name="el"></element>
</schema>""")
schema = etree.XMLSchema(xsd)
xml1 = etree.Element('el', nsmap={None: "some_namespace"})
xml2 = etree.fromstring(etree.tostring(xml1))
schema.assertValid(xml2) # this passes
schema.assertValid(xml1) # this fails
我看到xml1和xml2有不同的标签:
print xml1.tag # --> el
print xml2.tag # --> {some_namespace}el
但为什么xml1和xml2有这样的区别?看起来他们应该是一样的。
答案 0 :(得分:0)
在这里创建一个el
元素(没有命名空间):
xml1 = etree.Element('el', nsmap={None: "some_namespace"})
使用nsmap
参数不会将元素绑定到命名空间;它只提供了序列化的映射。
执行etree.tostring(xml1)
时,序列化行为“开始”。解析序列化结果后,xml2
是{some_namespace}el
元素而不是el
。
要使其正常工作,请将行更改为:
xml1 = etree.Element('{some_namespace}el', nsmap={None: "some_namespace"})