我想将某个参数传递给xml,所以我不想通过创建参数将其作为具有所有值的原始xml,而是希望使用参数来更改一个(例如,用户输入)
理想情况下,我一直在寻找<title> ¶m1 </title>
之类的东西,以后可以传递我想要的任何参数,但是我想这不可能完成。
所以就像无法传递参数一样(或者至少从我搜索的参数来看),我考虑过在创建xml之后对其进行编辑。
我搜索的大多数内容都是beautifulsoup,因为这是我要使用的(以及我正在使用的)。这只是我的项目的一小部分。 例如this和this是我的一些研究)。
这是我要执行的功能:
我们有一个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
答案 0 :(得分:2)
您必须打印结果或soup
而不是原始字符串editTest
for tag in soup.find_all('title'):
print (tag.string, '\n')
tag.string='invented title'
print(soup)
答案 1 :(得分:1)
使用诸如¶m;
之类的实体引用是XML本身中最接近的东西,但是它不是非常灵活,因为实体扩展是在DTD文件中定义的,而不是通过编程方式提供给XML解析器的。一些解析器(我不知道Python的情况)允许您提供EntityResolver,它可以以编程方式解析实体引用,但这不是我的首选方法。
当然,有一些模板语言可允许以编程方式构造XML。 XSLT是最明显的选择。它可能做的比您需要的要多得多,但这不一定是缺点。 https://en.wikipedia.org/wiki/Comparison_of_web_template_engines列出了一些其他选项-包括一些Python环境。不幸的是,根据我的经验,其中许多工具没有得到很好的记录或支持,因此,请仔细研究。
答案 2 :(得分:1)
使用可以运行XSLT 1.0脚本的Python lxml
和BeautifulSoup
的解析引擎,您可以 传递参数以根据需要修改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中传递参数