我有一个已加载到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。
谢谢,比尔
答案 0 :(得分:0)
我遇到的最大问题是Powershell将空节点解释为System.String而不是XML.XMLElement。附加QueryParameters节点的代码正在成功并将其添加到文档中。但是,由于它被解释为字符串而不是元素,因此它不会正确地进行追加并尝试使用正常的Powershell XML语法检查它是否存在失败。
相反,如果你有一个空节点,你可以使用$ xml.Parent.item找到它(&#34; EmptyNodeName&#34;)
这将返回一个具有AppendChild()方法的实际XML.XMLElement。