我目前从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列数据网格。当我在更复杂的报告上尝试相同的方法时,它会轰炸或只抓取一些字段。
答案 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)