使用Python来抓取RDL中的数据集和查询数据

问题描述:

我今天提出了使用Python解析SSRS RDL文件(XML)以收集DataSet和Query数据的意图。最近的一个项目让我回顾了各种报告和数据源,旨在整合和清理我们发布的内容。使用Python来抓取RDL中的数据集和查询数据

我能够使用此脚本创建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() 

我知道你问了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 
+0

一点点改变精美努力得到它到.ps1文件。我把它扔进去并试图运行它,而powershell不喜欢“空管元素”,所以我把最后的$ files命令放在同一行上。 我没有太多曝光PowerShell,但这只是让我进入它的东西。感谢JasonHorner的帮助! – Vinnie 2010-07-12 14:58:14