gpt4 book ai didi

python - 将变量附加到存储在变量中的 XML 字符串上

转载 作者:太空宇宙 更新时间:2023-11-03 16:21:22 25 4
gpt4 key购买 nike

我正在使用 Python 和 requests 库通过 XML 文件发送 POST 请求。我的 XML 文件如下所示:

property_name = """<wfs:Property>
<wfs:Name>Adm2_NAME</wfs:Name>
<wfs:Value>fff</wfs:Value>
</wfs:Property>"""

xml = """<wfs:Transaction service="WFS" version="1.0.0"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:wfs="http://www.opengis.net/wfs">
<wfs:Update typeName="geonode:tjk_nhr_shockriskscore">
""" + property_name + """
<ogc:Filter>
<ogc:FeatureId fid="tjk_nhr_shockriskscore.2"/>
</ogc:Filter>
</wfs:Update>
</wfs:Transaction>"""

正如您所看到的,有一个 property_name 变量,它实际上将由函数生成。

现在,我通过连接 XML 字符串手动附加了 property_name 变量。但由于我将拥有许多这样的变量,因此我需要找到一种方法将它们附加到正确的位置。

使用 Python 执行此操作的正确方法是什么?是否有可用的库或推荐的技术来实现这一目标?

最佳答案

考虑XSLT ,一种转换 XML 文件的专用语言,用于将其他 XML 的部分附加到主 XML 文件中。 Python的第三方模块,lxml ,可以处理XSLT 1.0脚本。 XSLT 维护 document() 功能,允许跨同一目录或子目录中的文档进行查询。但是,为了运行此方法,您必须将较小的 XML 字符串保存到磁盘或文件以及 XSLT 脚本以处理跨文档处理。

另一个重要的要求是较小的 XML 字符串必须在根标记 <wfs:Property xmlns:wfs="http://www.opengis.net/wfs"> 中定义其 namespace 。因此在输出到文件之前将其连接起来。要在 XSLT 中添加其他 XML 字符串转换文件,请遵循属性例程并添加一行 <xsl:copy-of select="document('OtherXML.xml')">在 xsl 模板中与指定的父节点匹配。

import lxml.etree as et

# SAVE XML TO FILE
nmsp = 'xmlns:wfs="http://www.opengis.net/wfs"'
property_name = '''<wfs:Property {}>
<wfs:Name>Adm2_NAME</wfs:Name>
<wfs:Value>fff</wfs:Value>
</wfs:Property>'''
xmlfile = open('Property.xml','w')
xmlfile.write(property_name.format(nmsp))
xmlfile.close()

# SAVE XSL TO FILE
xslstr = '''<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:ogc="http://www.opengis.net/ogc" xmlns:wfs="http://www.opengis.net/wfs">
<xsl:output version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>

<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="wfs:Update">
<xsl:copy>
<xsl:copy-of select="document('Property.xml')"/>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
</xsl:transform>'''
xslfile = open('XSLTScript.xsl','w')
xslfile.write(xslstr)
xslfile.close()

# PARSE MAIN XML STRING
xml = '''<wfs:Transaction service="WFS" version="1.0.0"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:wfs="http://www.opengis.net/wfs">
<wfs:Update typeName="geonode:tjk_nhr_shockriskscore">
<ogc:Filter>
<ogc:FeatureId fid="tjk_nhr_shockriskscore.2"/>
</ogc:Filter>
</wfs:Update>
</wfs:Transaction>'''
dom = et.fromstring(xml)

# TRANSFORM XML
xsl = et.parse('XSLTScript.xsl')
transform = et.XSLT(xsl)
newdom = transform(dom)

print(newdom)
# <?xml version="1.0"?>
# <wfs:Transaction xmlns:ogc="http://www.opengis.net/ogc"
# xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.0.0">
# <wfs:Update>
# <wfs:Property>
# <wfs:Name>Adm2_NAME</wfs:Name>
# <wfs:Value>fff</wfs:Value>
# </wfs:Property>
# <ogc:Filter>
# <ogc:FeatureId fid="tjk_nhr_shockriskscore.2"/>
# </ogc:Filter>
# </wfs:Update>
# </wfs:Transaction>

# OUTPUT FINAL XML
xmlfile = open('Final.xml','wb')
xmlfile.write(newdom)
xmlfile.close()
<小时/>

或者,仍然使用 XSLT,您可以绕过 document() 的任何需求。或将单个字符串保存到磁盘。在这种方法中,您只需将较小的 XML 字符串连接到 XSLT 的模板匹配即可。

import lxml.etree as et

# XML STRING
property_name = '''<wfs:Property>
<wfs:Name>Adm2_NAME</wfs:Name>
<wfs:Value>fff</wfs:Value>
</wfs:Property>'''

# XSL STRING
xslstr = '''<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:ogc="http://www.opengis.net/ogc" xmlns:wfs="http://www.opengis.net/wfs">
<xsl:output version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>

<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="wfs:Update">
<xsl:copy>
{}
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
</xsl:transform>'''.format(property_name)

# PARSE MAIN XML STRING
xmlstr = '''<wfs:Transaction service="WFS" version="1.0.0"
xmlns:ogc="http://www.opengis.net/ogc"
xmlns:wfs="http://www.opengis.net/wfs">
<wfs:Update typeName="geonode:tjk_nhr_shockriskscore">
<ogc:Filter>
<ogc:FeatureId fid="tjk_nhr_shockriskscore.2"/>
</ogc:Filter>
</wfs:Update>
</wfs:Transaction>'''
dom = et.fromstring(xmlstr)

# TRANSFORM XML
xsl = et.fromstring(xslstr)
transform = et.XSLT(xsl)
newdom = transform(dom)

print(newdom)
# <?xml version="1.0"?>
# <wfs:Transaction xmlns:ogc="http://www.opengis.net/ogc"
# xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.0.0">
# <wfs:Update>
# <wfs:Property>
# <wfs:Name>Adm2_NAME</wfs:Name>
# <wfs:Value>fff</wfs:Value>
# </wfs:Property>
# <ogc:Filter>
# <ogc:FeatureId fid="tjk_nhr_shockriskscore.2"/>
# </ogc:Filter>
# </wfs:Update>
# </wfs:Transaction>

# OUTPUT FINAL XML
xmlfile = open('Final.xml','wb')
xmlfile.write(newdom)
xmlfile.close()

关于python - 将变量附加到存储在变量中的 XML 字符串上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38419236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com