将QueryParameters节点添加到rdl XML

时间:2014-09-25 14:23:15

标签: xml powershell ssrs-2008 powershell-v2.0

我有一个已加载到Powershell xml变量的rdl。我想为报表中的每个数据集添加一个查询参数,但我发现我首先要检查数据集是否首先包含任何查询参数。

如果数据集没有任何查询参数,则它没有QueryParameters节点来调用AppendChild()。

我的rdl被加载到一个名为$ target的变量中。我可以将所有不具有QueryParameters节点的DataSet放入名为$ nodes的变量中。我的问题是,我在网上看到的大多数教程看起来都像$节点包含指向我的$ target变量中实际节点的指针集合。但是在我更新$ nodes以添加QueryParameters节点之后,我重新检查了我的$ target变量,并且我没有看到它更新。

所以问题是,如果我有一个节点集合,使得路径不是通过点语法可以到达的直线,那么如何以更新父变量xml的方式更新该集合的一个成员?

以下是我已有的代码。

# Load the rdl
[xml]$target = New-Object System.XML.XMLDocument
$target.Load(<Path-to-rdl>)

$ns = @{r='http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition';rd='http://schemas.microsoft.com/SQLServer/reporting/reportdesigner'}


$nsmgr = New-Object System.Xml.XmlNamespaceManager($target.NameTable)
$nsmgr.AddNameSpace("r",$ns.r)
$nsmgr.AddNameSpace("rd",$ns.rd)

# Grab the query nodes    
$nodes = $target.SelectNodes("//r:DataSet/r:Query",$nsmgr)


# Attempt to load the QueryParameters node. If $p is $NULL I know it didn't have one.
$nodes | %{
        $p = $_.SelectSingleNode("./r:QueryParameters",$nsmgr)
        IF($p -eq $NULL){
          $p = $target.CreateElement("QueryParameters")
          # Many tutorials assume $_ here points back to xml in my $target variable
          $_.AppendChild($p) 
        } 
    }

$nodes = $NULL

$nodes = $target.SelectNodes("//r:DataSet/r:Query",$nsmgr)

$nodes | %{
        $p = $_.SelectSingleNode("./r:QueryParameters",$nsmgr)
        # But after I reload the nodes from $target some still don't have the
        # QueryParameters node I appended earlier.
        IF($p -eq $NULL){
          "NULL" 
        } ELSE {"NOT NULL"}
    }

如何确保使用新的QueryParameters节点更新$ target,以便当我将其写回磁盘时,它会在那里?

这也是我下一步需要解决的问题。如果我无法更新,那么我也无法将新的QueryParameter节点添加到每个DataSet。

谢谢,比尔

1 个答案:

答案 0 :(得分:0)

我遇到的最大问题是Powershell将空节点解释为System.String而不是XML.XMLElement。附加QueryParameters节点的代码正在成功并将其添加到文档中。但是,由于它被解释为字符串而不是元素,因此它不会正确地进行追加并尝试使用正常的Powershell XML语法检查它是否存在失败。

相反,如果你有一个空节点,你可以使用$ xml.Parent.item找到它(&#34; EmptyNodeName&#34;)

这将返回一个具有AppendChild()方法的实际XML.XMLElement。