我使用lxml验证XML文件的语法错误是否正确?

2024-09-24 02:17:47 发布

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

我试着用下面的pom.xml文件创建Python脚本并使用lxml验证pom是否存在语法错误,以进一步确认<version>SNAPSHOT,并更新{}以匹配此格式ci_{git hub org}_{branch name}-SNAPSHOT。在

project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.wsi.devops</groupId>
  <artifactId>python-test</artifactId>
  <version>1.0-SNAPSHOT</version>
</project>

这就是我目前的解决方案

^{pr2}$

只是想为我在剧本中犯的任何错误得到一些帮助。在


Tags: orgprojecthttpversionapachesnapshotxsdpom
1条回答
网友
1楼 · 发布于 2024-09-24 02:17:47

代码的主要问题是错误地使用了ElementTreeparse()方法。它使用一个标记名或某种简化的xpath语法,而您似乎把它当作str.查找()接受任意字符串的方法。您需要的是版本标记。在

解析代码应该如下所示:

version = tree.find('ns:version', {ns:'http://maven.apache.org/POM/4.0.0'})
if 'SNAPSHOT' in version.text:
    version.text = 'ci_{git hub org name here}_{branch name here}'
    # I guess you have some other code that sets this version properly
else:
    print("Not a snapshot.")

请注意,您必须始终设置一个名称空间来查找版本。这就引出了我的第二点:为什么要对文件进行两次解析?lxml只是xml的一个更具特色的版本。你只需要导入一个!lxml还有一个优点,它的元素树有一个nsmap属性,因此您不必自己输入名称空间。如果Apache发布了一个新的Maven版本或其他东西,我想这会使它更加健壮:

^{pr2}$

对于完整的代码,仅使用lxml

from lxml import etree
import sys

# parse xml
try:
    tree = etree.parse(sys.argv[1])
    print('XML well formed, syntax ok.')

except OSError: # check for file errors (e.g missing)
    print("Bad file: " + sys.argv[1])
    quit()

# check for XML syntax errors
except etree.XMLSyntaxError as err:
    print('XML Syntax Error, see error_syntax.log')
    with open('error_syntax.log', 'w') as error_log_file:
        error_log_file.write(str(err.error_log))
    quit()

except:
    print('Unknown error, exiting.')
    quit()

#Update version
version = tree.find('ns:version', {'ns':tree.getroot().nsmap[None]})
if 'SNAPSHOT' not in version.text:
    print("Not a snapshot")
    quit() # Quitting after a failure is a way to avoid nesting
version.text = 'ci_{git hub org name}_{branch name}'
# I guess you have some other code that sets this version properly
tree.write(sys.argv[1])

相关问题 更多 >