奇怪的lxml行为

时间:2014-03-20 13:59:54

标签: python xml lxml

我手动创建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有这样的区别?看起来他们应该是一样的。

1 个答案:

答案 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"})