2010-07-08 6 views
1

Je définis aujourd'hui avec l'intention d'analyser un fichier RDL SSRS (XML) en utilisant Python afin de rassembler les données DataSet et Query. Un projet récent m'a renvoyé à un suivi de divers rapports et sources de données dans le but de consolider et de nettoyer ce que nous avons publié.Utilisation de Python pour extraire des données DataSet et Query à partir de RDL

J'ai été capable d'utiliser ce script pour créer un fichier CSV avec les colonnes suivantes: chemin du système | rapport nom du fichier | type de commande | commande texte |

Ce n'est pas très élégant, mais ça marche. Ce que j'espère être en mesure de faire avec ce post est de solliciter l'un de vos experts qui ont déjà essayé ceci ou qui sont expérimentés dans l'analyse XML avec Python pour essayer de le nettoyer et de fournir la capacité à:

  • en-têtes, ce qui serait des balises XML
  • Inclure le nom dans la colonne DataSet
  • obtenir des résultats en un seul fichier

ici est le code complet dans mon fichier "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() 

Répondre

0

Je sais que vous avez demandé Python; mais je me suis dit que les capacités de gestion XML de Powershell rendraient cela assez simple. Même si je suis sûr que ce n'est pas un gourou, je pense qu'il est sorti assez bien (les lignes commençant par # sont des commentaires):

# 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

avec un magnifiquement travaillé peu de changement pour l'obtenir dans un fichier .ps1. Je l'ai jeté et j'ai essayé de l'exécuter et Powerhell n'aimait pas le "tuyau vide", donc j'ai mis la dernière commande $ files sur la même ligne. Je n'ai pas eu beaucoup d'exposition avec PowerShell, mais ce sera juste la chose pour me mettre dedans. Merci pour l'aide JasonHorner! – Vinnie

Questions connexes