在存储在variab中的XML字符串上追加变量

2024-05-20 01:52:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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进行此操作的正确方法是什么?是否有可用的库或推荐的技术来实现这一点?在


Tags: 文件nameogcopengishttpnetvaluewww
1条回答
网友
1楼 · 发布于 2024-05-20 01:52:47

考虑一下转换XML文件的专用语言XSLT,将其他XML的一部分附加到主XML文件中。Python的第三方模块lxml,可以处理xslt1.0脚本。XSLT维护^{}函数,允许跨同一目录或子目录中的文档进行查询。但是,为了运行这种方法,必须将较小的XML字符串保存到磁盘或文件中,以及XSLT脚本来处理跨文档处理。在

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

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的模板匹配中。在

^{pr2}$

相关问题 更多 >