有没有办法将参数传递给xml?还是修改它?

时间:2019-01-03 08:23:28

标签: python xml beautifulsoup

我想将某个参数传递给xml,所以我不想通过创建参数将其作为具有所有值的原始xml,而是希望使用参数来更改一个(例如,用户输入)

理想情况下,我一直在寻找<title> &param1 </title>之类的东西,以后可以传递我想要的任何参数,但是我想这不可能完成。

所以就像无法传递参数一样(或者至少从我搜索的参数来看),我考虑过在创建xml之后对其进行编辑。

我搜索的大多数内容都是beautifulsoup,因为这是我要使用的(以及我正在使用的)。这只是我的项目的一小部分。 例如thisthis是我的一些研究)。

这是我要执行的功能: 我们有一个xml,找到了要编辑的部分,然后对其进行了编辑(我知道要访问它,它必须是整数pruebaEdit[anyString]不正确。

def editXMLTest():
    editTest="""<?xml version="1.0" ?>
<books>
  <book>
    <title>moon</title>
    <author>louis</author>
    <price>8.50</price>
  </book>
</books>
    """
    soup =BeautifulSoup(editTest)
    for tag in soup.find_all('title'):
        print (tag.string, '\n')
        #tag.string='invented title'
        editTest[tag]='invented title' #I know it has to be an integer, not a string
    print()
    print(editTest)

我的预期输出应该在xml中:<title>invented title</title>而不是<title>moon</title>

编辑:在我的研究中添加了this

4 个答案:

答案 0 :(得分:2)

您必须打印结果或soup而不是原始字符串editTest

for tag in soup.find_all('title'):
    print (tag.string, '\n')
    tag.string='invented title'
print(soup)

答案 1 :(得分:1)

使用诸如&param;之类的实体引用是XML本身中最接近的东西,但是它不是非常灵活,因为实体扩展是在DTD文件中定义的,而不是通过编程方式提供给XML解析器的。一些解析器(我不知道Python的情况)允许您提供EntityResolver,它可以以编程方式解析实体引用,但这不是我的首选方法。

当然,有一些模板语言可允许以编程方式构造XML。 XSLT是最明显的选择。它可能做的比您需要的要多得多,但这不一定是缺点。 https://en.wikipedia.org/wiki/Comparison_of_web_template_engines列出了一些其他选项-包括一些Python环境。不幸的是,根据我的经验,其中许多工具没有得到很好的记录或支持,因此,请仔细研究。

答案 2 :(得分:1)

使用可以运行XSLT 1.0脚本的Python lxmlBeautifulSoup的解析引擎,您可以 传递参数以根据需要修改XML文件。只需在XSLT脚本中设置<xsl:param>,并在Python中通过strparam传递值即可:

XSLT (另存为.xsl文件,一个特殊的.xml文件)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes" omit_xml_declaration="no"/>
  <xsl:strip-space elements="*"/>

  <!-- INITIALIZE PARAMETER -->
  <xsl:param name="new_title" /> 

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

  <!-- REWRITE TITLE TEXT -->
  <xsl:template match="title">
    <xsl:copy>
      <xsl:value-of select="$new_title"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

Python (请参见下面的输出作为注释)

import lxml.etree as et

txt = '''<books>
           <book>
               <title>moon</title>
               <author>louis</author>
               <price>8.50</price>
             </book>
         </books>'''

# LOAD XSL SCRIPT
xml = et.fromstring(txt)
xsl = et.parse('/path/to/XSLTScript.xsl')
transform = et.XSLT(xsl)

# PASS PARAMETER TO XSLT
n = et.XSLT.strparam('invented title')
result = transform(doc, new_title=n)

print(result)
# <?xml version="1.0"?>
# <books>
#   <book>
#     <title>invented title</title>
#     <author>louis</author>
#     <price>8.50</price>
#   </book>
# </books>

# SAVE XML TO FILE
with open('Output.xml', 'wb') as f:
    f.write(result)

Pyfiddle Demo (请确保单击运行并检查输出)

答案 3 :(得分:-1)

使用<xsl>标签在xml中传递参数