使用Python抓取数据集并查询RDL数据
今天我打算用Python来解析一个SSRS RDL文件(其实就是XML文件),目的是提取数据集和查询数据。最近我在做一个项目,需要回顾各种报告和数据源,想把我们发布的内容整理和清理一下。
我用这个脚本成功创建了一个CSV文件,里面有以下几列: 系统路径|报告文件名|命令类型|命令文本|
虽然这个方法不是特别完美,但它能正常工作。
我希望通过这篇帖子,能请教一下那些有经验的专家们,看看有没有人尝试过类似的事情,或者在用Python解析XML方面有经验的朋友,能帮我改进一下这个脚本,并实现以下功能:
- 添加表头,也就是XML标签
- 在列中包含数据集名称
- 把结果输出到一个文件中
以下是我在“rdlparser.py”文件中的完整代码:
import sys, os
from xml.dom import minidom
xmldoc = minidom.parse(sys.argv[1])
content = ""
TargetFile = sys.argv[1].split(".", 1)[0] + ".csv"
numberOfQueryNodes = 0
queryNodes = xmldoc.getElementsByTagName('Query')
numberOfQueryNodes = queryNodes.length -1
while (numberOfQueryNodes > -1):
content = content + os.path.abspath(sys.argv[1])+ '|'+ sys.argv[1].split(".", 1)[0]+ '|'
outputNode = queryNodes.__getitem__(numberOfQueryNodes)
children = [child for child in outputNode.childNodes if child.nodeType==1]
numberOfQueryNodes = numberOfQueryNodes - 1
for node in children:
if node.firstChild.nodeValue != '\n ':
if node.firstChild.nodeValue != 'true':
content = content + node.firstChild.nodeValue + '|'
content = content + '\n'
fp = open(TargetFile, 'wb')
fp.write(content)
fp.close()
1 个回答
0
我知道你问的是Python,但我觉得PowerShell自带的处理XML的功能会让这个事情变得简单很多。虽然我不敢说这是高手水平的代码,但我觉得效果还不错(以#开头的行是注释):
# The directory to search
$searchpath = "C:\"
# List all rdl files from the given search path recusrivley searching sub folders, store results into a variable
$files = gci $searchpath -recurse -filter "*.rdl" | SELECT FullName, DirectoryName, Name
# for each of the found files pass the folder and file name and the xml content
$files | % {$Directory = $_.DirectoryName; $Name = $_.Name; [xml](gc $_.FullName)}
# in the xml content navigate to the the DataSets Element
| % {$_.Report.DataSets}
# for each query retrieve the Report directory , File Name, DataSource Name, Command Type, Command Text output thwese to a csv file
| % {$_.DataSet.Query} | SELECT @{N="Path";E={$Directory}}, @{N="File";E={$Name}}, DataSourceName, CommandType, CommandText | Export-Csv Test.csv -notype