Python verwenden, um DataSet zu kratzen und Daten von RDL abzufragen

Ich habe heute mit der Absicht, eine SSRS RDL-Datei (XML) mit Python zu analysieren, um die DataSet und Abfrage Daten zu sammeln. Ein neues Projekt hat mich zurück auf eine Vielzahl von Berichten und Datenquellen mit der Absicht zu konsolidieren und zu bereinigen, was wir veröffentlicht haben.

Ich konnte dieses Skript verwenden, um eine CSV-Datei mit den folgenden Spalten zu erstellen: Systempfad | Report Dateiname | Befehlstyp | Befehlstext |

Es ist nicht sehr elegant, aber es funktioniert.

Was ich in der Lage bin, mit diesem Beitrag zu tun, ist für jeden von euch Experten da draußen, die es entweder schon einmal probiert haben oder in XML-Parsing mit Python erlebt haben, um einen Schuss zu machen, um ihn aufzuräumen und die Möglichkeit zu bieten:

  • Include Header, das wäre XML-Tags
  • Geben Sie den Datensatznamen in die Spalte ein
  • Ergebnisse in einzelne Datei liefern

Hier ist der volle Code in meiner Datei "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() 

One Solution collect form web for “Python verwenden, um DataSet zu kratzen und Daten von RDL abzufragen”

Ich weiß, dass du nach Python gefragt hast. Aber ich dachte, Powershell's in XML-Handling-Fähigkeiten gebaut würde dies ziemlich einfach machen. Während ich sicher bin, dass es keine Guru-Ebene ist, denke ich, dass es ziemlich schön herauskam (die Zeilen beginnend mit # sind Kommentare):

 # 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 
  • Entity Referenzen und lxml
  • Warum ist BeautifulSoup nicht in der Lage, dieses RSS (XML) Dokument korrekt zu lesen / zu analysieren?
  • Wie kann ich den Inhalt des XML-Root-Elements in Python abrufen?
  • Iterativ analysiere eine große XML-Datei ohne den DOM-Ansatz
  • Python: xml.etree.ElementTree, Entfernen von "Namespaces"
  • Gibt es irgendwelche Vorteile der Verwendung von Beautiful Soup zu analysieren XML über die Verwendung von lxml alleine?
  • Serialize Python Wörterbuch zu XML [geschlossen]
  • Python-Textdatei in XML
  • Mit lxml und iterparse (), um eine große (+ - 1Gb) XML Datei zu analysieren
  • Hinzufügen von xsi: Typ und Umschlag Namespace bei Verwendung von SUDS
  • Parse großes XML mit lxml
  • Python ist die beste Programmiersprache der Welt.