如何使用xml解析器编辑pmml模型文件

时间:2018-02-13 03:27:58

标签: python xml pmml

我想从我生成的pmml文件中删除一些节点。所以我尝试在python中使用xml解析器:

from xml.etree.ElementTree import ElementTree
tree = ElementTree()
tree.parse('treedemo.pmml')
for inter in tree.findall('DataDictionary'):
    print(inter)

事实证明,打印输出没有,这意味着xml解析器不起作用。 pmml文件是here。假设我要删除

<Interval closure="closedClosed" leftMargin="21.0" rightMargin="46.0"/>

来自

<DataField name="fk_057_nearcontact_auth_expire_time" optype="continuous" dataType="float">
    <Interval closure="closedClosed" leftMargin="21.0" rightMargin="46.0"/>
</DataField>

可以通过python编辑和修改pmml文件吗?

2 个答案:

答案 0 :(得分:0)

您应该了解一种名为XSL Transformations(XSLT)的现有技术,而不是开发自定义XML操作代码。

简而言之,您需要创建一个XSL文档,该文档指定XML操作操作。然后,您可以使用命令行XSLT工具将此XSL文档应用于一个或多个XML文档(包括PMML文档)。例如,在GNU / Linux系统上,您可以使用xsltproc工具。

用于删除Interval元素的XSL文档:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:pmml="http://www.dmg.org/PMML-4_2">
    <!-- By default, copy all -->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <!-- However, in case of the PMML Interval element, take no (copy-) action -->
    <xsl:template match="pmml:Interval"/>
</xsl:stylesheet>

确保配置pmml命名空间前缀的值以匹配PMML文档的值。以上示例适用于PMML架构版本4.2文档。

然后,将样式表应用于PMML文件(命令语法xsltproc <XSL file> <PMML file(s)>):

$ xsltproc --output test-mod.pmml test.xsl test.pmml

答案 1 :(得分:0)

通常,使用pmml文件是有风险的,只是要小心。

您可以使用BeautifulSoup。 对于您的特定目标,标签“时间间隔”仅显示一次,因此您只需一步即可找到该标签,然后将其提取:

# import BeautifulSoup
from bs4 import BeautifulSoup
# open and read the file
inf = open(r'treedemo.xml', 'r')
txt = inf.read()
inf.close()
# prepare the soup
soup = BeautifulSoup(txt, 'xml')
# now find the tag you want to remove, in this case it's easy, since the tag 'Interval' is unique across your pmml file:
interval = soup.find('Interval')
# remove the tag
interval.extract()
# write the updated pmml file
with open(r'treedemo_clean.xml', "w") as outf:
    outf.write(str(soup))
  • 除非您使用outf.write(str(soup.prettify())),否则输出将没有缩进
  • 我不建议使用美化。可能会弄乱pmml
  • 如果标签不是唯一的,那么您必须仔细查找它,以避免删除错误的标签并破坏您的pmml。
  • 您要删除的字段没有问题。它显示了训练数据集中的统计信息。您可以将标志设置为with_statistics = False