提问人:svenGUTT 提问时间:9/9/2023 更新时间:9/9/2023 访问量:30
将 SSRS 报表 XML 中的根报表节点更新为包括 rd 节点
Update root Report node in SSRS report XML to include rd node
问:
我有一个 powershell 脚本,我们运行该脚本来更新整个目录的 RDL 文件,方法是将其连接字符串从共享更改为嵌入,并向每个参数添加 Hidden = True 标记。
这一直很好,直到我们最近遇到一份较旧的报告。连接更新的一部分是将“安全类型”从“无”设置为“数据库”。我发现,在这几个实例中,它没有更新 SecurityType 节点,而是添加了一个全新的实例,导致报表在报表生成器中打开时出错。
在检查 XML 时,我注意到根节点中只有默认命名空间,它不包含 rd 引用。但是,SecurityTYpe 节点是使用 rd 引用设置的...当 powershell 命中此节点时,它无法读取它,并且它认为没有 SecurityType 节点,因此它写入了一个新的节点。 这是有问题的根节点...
<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition">
这是 SecurityType 节点在同一报告中的样子:
<rd:SecurityType xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">None</rd:SecurityType>
如果我手动将 rd 命名空间添加到“报表”节点,则 powershell 工作正常。所以我想知道如何将其更新为:
<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">
这是 PS 脚本(使用 System.Xml.Linq)获取 xml 和命名空间的方式:
$ns = $doc.Root.GetDefaultNamespace()
$rd = $doc.Root.GetNamespaceOfPrefix("rd");
$p1 = $doc.Root.GetNamespaceOfPrefix("p1");
然后,我们遍历 DataSource 节点以获取其不同的元素:
foreach($dataSource in $dataSources)
{
$dataSourceName = $dataSource.FirstAttribute.Value
$securityType = $dataSource.Element($rd + "SecurityType")
$securityTypeVal = $securityType.Value
...
不过,正是在这里,设置$securityType和$securityTypeVal都出现了问题......即使它们确实存在,它们也会返回 NULL。
if($securityType -eq $null)
{
$dataSource.Add([System.Xml.Linq.XElement]::new($rd + [System.Xml.Linq.XName]::get('SecurityType'),'Database'))
}
else
{
if($securityTypeVal -ne "Database")
{
$securityType.SetValue('Database')
$securityTypeVal = $dataSource.Element($rd + "SecurityType").Value
}
}
在尝试处理 SecurityType 时,我应该考虑根中缺少的 rd 命名空间前缀吗?或者有没有办法查看它是否存在,如果缺少它,请添加它?我一直在尝试各种拼凑的方法来添加它,但我远非这种语言的专家,我所做的一切都导致了各种错误。我感谢任何帮助。
答: 暂无答案
评论