У меня есть rdl, который я загрузил в переменную xml Powershell. Я хочу добавить параметр запроса к каждому из наборов данных в отчете, но я обнаружил, что сначала мне нужно проверить, есть ли в наборе данных какие-либо параметры запроса.Добавление узла QueryParameters в rdl XML
Если в наборе данных нет параметров запроса, у него нет узла QueryParameters для вызова AppendChild().
My rdl загружается в переменную с именем $ target. Я могу получить все DataSet, у которых нет узла QueryParameters, в переменную с именем $ nodes. Моя проблема заключается в том, что большинство обучающих программ, которые я вижу в Интернете, похоже, работают так, как будто $ nodes содержит набор указателей обратно к фактическим узлам в моей переменной $ target. Но после того, как я обновил $ nodes, чтобы добавить узел QueryParameters, я затем перепровежу мою целевую переменную $, и я не вижу, чтобы она обновлялась.
Итак, вопрос в том, что если у меня есть набор узлов таким образом, что путь не является прямой линией, доступной через точечный синтаксис, как я могу обновить один член этой коллекции таким образом, чтобы обновлял родительские переменные 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 так, что, когда я пишу его обратно на диск он будет там?
Это также проблема, которую я должен решить для своего следующего шага. Если я не смогу получить это обновление, я также не смогу добавить новый узел QueryParameter в каждый DataSet.
Спасибо, Билл