我想从我生成的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文件吗?
答案 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))