【问题标题】:Using Python to scrape DataSet and Query data from RDL使用 Python 从 RDL 中抓取数据集和查询数据
【发布时间】:2010-07-08 19:00:01
【问题描述】:

我今天开始打算使用 Python 解析 SSRS RDL 文件 (XML),以收集 DataSet 和 Query 数据。最近的一个项目让我回溯了各种报告和数据源,目的是巩固和清理我们发布的内容。

我能够使用此脚本创建一个包含以下列的 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 xml reporting-services rdl minidom


    【解决方案1】:

    我知道你要的是 Python;但我认为 Powershell 内置的 xml 处理功能会使这变得相当简单。虽然我确定它不是大师级别的,但我认为它表现得非常好(以 # 开头的行是 cmets):

    # 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   
    

    【讨论】:

    • 工作得很好,只需稍作改动即可将其放入 .ps1 文件中。我将它直接倾倒并尝试运行它,powershell 不喜欢“空管道元素”,所以我将最后一个 $files 命令放在同一行。我对 powershell 的接触不多,但这正是让我参与其中的原因。感谢 JasonHorner 的帮助!
    猜你喜欢
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多