使用PowerShell从.RDL文件中提取TextBox值

时间:2014-05-12 17:52:56

标签: xml powershell reporting-services rdl

我目前从ReportServer数据库中获取一组RDL文件,并循环遍历每个.RDL(这是一个XML文件),并将RDL中每个文本框的值写入文件(或者只是显示在屏幕上)这一点)。

我可以从数据库中获取文件没问题,我可以遍历每个文件,但我不能始终获得每个表中的所有文本框值。有时会跳过表格。我最初尝试使用一个非常基本的RDL文件。下面的示例是在标题行中获取文本框的名称。

$FilePath = "C:\XML\Report.rdl"
[System.Xml.XmlDocument]$RDLFile = New-Object system.Xml.XmlDocument
$RDLFile.load($FilePath)
clear

      foreach($textbox in $RDLFile.Report.Body.ReportItems.Table.Header.TableRows.TableRow.TableCells.TableCell)
            {
                  $textboxname = $textbox.ReportItems.Textbox.Name
                  Write-Host($textboxname)
            }

这个工作的RDL是一个简单的RDL,上面有一个3列数据网格。当我在更复杂的报告上尝试相同的方法时,它会轰炸或只抓取一些字段。

2 个答案:

答案 0 :(得分:0)

可能有用的一件事是尝试使用selectnode方法:

http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.selectnodes.aspx

它会让你选择一个可能比点符号更容易的xpath

$FilePath = "C:\XML\Report.rdl"
[System.Xml.XmlDocument]$RDLFile = New-Object system.Xml.XmlDocument
$RDLFile.load($FilePath)
$TableNames = $RDLFile.SelectNodes("//ReportItems/Textbox/Name")

foreach($textbox in $TableName){
    $textbox
    ##Or $textbox.attribute if trying to pull an attribute
}

我尝试使用PowerShell 3(使用类似的xml)进行上述操作,但我不知道它是否与PowerShell 2的工作方式相同。

答案 1 :(得分:0)

您可以尝试将SelectNodes方法与XPath选择器一起使用。
注意:您需要先定义名称空间,然后才能使用XPath选择器。还要在XPath选择器中使用“ ns:”。

这里是一个例子:

$rdl = New-Object XML
$rdl.Load($reportFullPath)
$nsm = New-Object Xml.XmlNamespaceManager($rdl.NameTable)
$nsm.AddNamespace("ns", $rdl.DocumentElement.NamespaceURI)
$elements = $rdl.SelectNodes("//ns:Textbox", $nsm)