Использование Python для очистки DataSet и запроса данных из RDL

1

Сегодня я изложил намерение разобрать SSRS RDL файл (XML) с использованием Python для сбора данных DataSet и Query. Недавний проект позволил мне отслеживать различные отчеты и источники данных с целью консолидации и очистки того, что мы опубликовали.

Я смог использовать этот script для создания CSV файла со следующими столбцами: системный путь | имя файла отчета | тип команды | текст команды |

Это не очень элегантно, но он работает.

То, что я надеюсь сделать с этим сообщением, запрашивается для любого из вас экспертов, которые либо уже это пробовали, либо имеют опыт в анализе XML с Python, чтобы сделать снимок при его очистке и предоставили способность:

  • Включить заголовки, которые будут тегами XML
  • Включить имя DataSet в столбец
  • Поставить результаты в один файл

Вот полный код в файле "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()
Теги:
reporting-services
minidom
rdl

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   
  • 0
    Работал прекрасно с небольшими изменениями, чтобы получить его в файл .ps1. Я выбросил его прямо и попытался запустить, и powershell не понравился «пустой элемент pipe», поэтому я поместил последнюю команду $ files в той же строке. У меня не было особого знакомства с PowerShell, но это как раз то, что поможет мне в этом. Спасибо за помощь JasonHorner!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню