2014-09-25 98 views
0

我有一個已加載到Powershell xml變量的rdl。我想爲報表中的每個數據集添加一個查詢參數,但是我發現我首先必須檢查數據集是否具有任何查詢參數。將QueryParameters節點添加到rdl XML

如果一個數據集沒有任何查詢參數,那麼它沒有一個QueryParameters節點來調用AppendChild()。

我的rdl被加載到一個名爲$ target的變量中。我可以將沒有QueryParameters節點的所有DataSet放入名爲$ nodes的變量中。我的問題是,我在網上看到的大多數教程似乎都起作用,好像$節點包含指向我的$ target變量中實際節點的指針集合。但是,在更新$節點以添加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節點更新,這樣,當我把它寫回到磁盤它會在那裏?

這也是我下一步需要解決的一個問題。如果我不能得到這個更新,那麼我也將無法將新的QueryParameter節點添加到每個DataSet。

謝謝你,比爾

回答

0

我遇到的最大的問題是,PowerShell的解釋空節點作爲System.String而不是XML.XMLElement。追加QueryParameters節點的代碼成功並將其添加到文檔中。但是,由於它被解釋爲字符串而不是元素,因此它不會正確追加,並嘗試使用普通的Powershell XML語法來檢查它是否存在。

相反,如果你有你有一個空的節點發現它使用$ xml.Parent.item(「EmptyNodeName」)

這將返回具有appendChild()方法的實際XML.XMLElement。