2014-09-25 3 views
0

У меня есть 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.

Спасибо, Билл

ответ

0

Самая большая проблема у меня была в том, что Powershell интерпретирует пустые узлы как System.String вместо XML.XMLElement. Код, который добавил узел QueryParameters, сменился и добавил его в документ. Но так как он интерпретируется как строка, а не элемент, он не принимает должным образом и пытается проверить его присутствие с использованием обычного синтаксиса PowerShell XML.

Вместо если у вас есть пустой узел у вас есть найти его с помощью $ xml.Parent.item («EmptyNodeName»)

Это возвращает реальный XML.XMLElement, который имеет метод AppendChild().

Смежные вопросы