【问题标题】:Python: adding xml schema attributes with lxmlPython:使用 lxml 添加 xml 模式属性
【发布时间】:2013-02-28 10:39:46
【问题描述】:

我编写了一个脚本,以 xml 格式打印出当前目录中的所有 .xml 文件,但我不知道如何将 xmlns 属性添加到顶级标记。 我想得到的输出是:

<?xml version='1.0' encoding='utf-8'?>
<databaseChangeLog 
      xmlns="http://www.host.org/xml/ns/dbchangelog"
      xmlns:xsi="http://www.host.org/2001/XMLSchema-instance"
      xsi:schemaLocation="www.host.org/xml/ns/dbchangelog">

    <include file="cats.xml"/>
    <include file="dogs.xml"/>
    <include file="fish.xml"/>
    <include file="meerkats.xml"/>

</databaseChangLog>

但是,这是我得到的输出:

 <?xml version='1.0' encoding='utf-8'?>
 <databaseChangeLog>
    <include file="cats.xml"/>
    <include file="dogs.xml"/>
    <include file="fish.xml"/>
    <include file="meerkats.xml"/>
 </databaseChangLog>

这是我的脚本:

import lxml.etree
import lxml.builder
import glob

E = lxml.builder.ElementMaker()
ROOT = E.databaseChangeLog
DOC = E.include

# grab all the xml files
files = [DOC(file=f) for f in glob.glob("*.xml")]
the_doc = ROOT(*files)

str = lxml.etree.tostring(the_doc, pretty_print=True, xml_declaration=True, encoding='utf-8')

print str

我在网上找到了一些显式设置命名空间属性的示例,herehere,但老实说,当我刚刚开始时,它们让我有点不知所措。还有另一种方法可以将这些 xmlns 属性添加到 databaseChangeLog 标记中吗?

【问题讨论】:

    标签: python xsd lxml


    【解决方案1】:
    import lxml.etree as ET
    import lxml.builder
    import glob
    
    dbchangelog = 'http://www.host.org/xml/ns/dbchangelog'
    xsi = 'http://www.host.org/2001/XMLSchema-instance'
    E = lxml.builder.ElementMaker(
        nsmap={
            None: dbchangelog,
            'xsi': xsi})
    
    ROOT = E.databaseChangeLog
    DOC = E.include
    
    # grab all the xml files
    files = [DOC(file=f) for f in glob.glob("*.xml")]
    
    the_doc = ROOT(*files)
    the_doc.attrib['{{{pre}}}schemaLocation'.format(pre=xsi)] = 'www.host.org/xml/ns/dbchangelog'
    
    print(ET.tostring(the_doc,
                      pretty_print=True, xml_declaration=True, encoding='utf-8'))
    

    产量

    <?xml version='1.0' encoding='utf-8'?>
    <databaseChangeLog xmlns:xsi="http://www.host.org/2001/XMLSchema-instance" xmlns="http://www.host.org/xml/ns/dbchangelog" xsi:schemaLocation="www.host.org/xml/ns/dbchangelog">
      <include file="test.xml"/>
    </databaseChangeLog>
    

    【讨论】:

    • 成功了,非常感谢!您是否会碰巧知道如何格式化类似于上面我想要的输出中的输出?我认为 pretty_print 可能对此有所帮助,但在那里似乎无济于事:(
    • 抱歉,我不知道有什么可靠的方法来做到这一点。
    • 真的希望你还在,大约 5 年后。这对我有很大帮助,但我不理解 '{{{pre}}}schemaLocation'.format(pre=xsi) 的构造。我理解格式,但是为什么要在 pre 周围加上三个大括号?
    • 我们想要一个'{uri}local' 形式的XML 限定名。这个字符串有大括号,但是大括号对 format 方法有特殊的含义,所以我们需要“转义”它们来告诉 format 我们想要大括号而不是字符串替换。 "If you need to include a brace character in the literal text, it can be escaped by doubling: {{ and }}."。换句话说,当format 遇到 2 个大括号时,它会返回一个带有 1 个文字大括号的字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    相关资源
    最近更新 更多