由于RDL XML文件中使用了两个命名空间:

<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">

一个默认命名空间:xmlns="http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition"

没有前缀的元素属于默认命名空间,如:<DataSets>,<DataSet Name="Data">,<DataField>item_no</DataField>,<TypeName>System.String</TypeName>等。

访问时要使用XmlNamespaceManager,给这个默认命名空间起个别名,如:def.

XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDoc.NameTable);
nsmgr.AddNamespace("def", "http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition");

SelectSingleNode时,也要加上这个def,如:root.SelectSingleNode(string.Format("def:DataSet[@Name='{0}']", dataSetName), nsmgr);

与xeDataSet.SelectSingleNode(string.Format("def:Fields/def:Field[@Name='{0}']", parameterName), nsmgr);

-----------------

一个名为"rd"的命名空间:xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"

目前只有一个元素在使用:<rd:TypeName>System.String</rd:TypeName>

-------------

防止子元素出现 xmlns="" 的情况。在创建每个元素时都要指定命名空间。

xmlDoc.CreateElement("TypeName", nspDef);   这个是默认命名空间的。

xmlDoc.CreateElement("rd", "TypeName", nspRd);  这个是rd命名空间的。

zzz

public static void UpDateClientLocalXml2(string rdlFilePath, string type, string dataSetName, string parameterName, string parameterType)
{
//2014.05.28-30 Qingl 加入 报表文件升级的处理
//测试追加已打开的报表文件rdl文件是否存在该节点字段 ,不存在则先追加
bool fieldIsFlag = true; //明细字段是否存在,false 代表不存在,true代表存在 if (string.IsNullOrEmpty(dataSetName)) dataSetName = "Data"; #region 方法2 //1.加载rdl的xml文件
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(rdlFilePath); //<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition"
//xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"> //2.默认命名空间
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDoc.NameTable);
nsmgr.AddNamespace("def", "http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition"); string nspDef = "http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition";
string nspRd = "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"; if (type == "Fields")
{
//["DataSets"]["DataSet"]["Fields"] XmlElement root = xmlDoc.DocumentElement["DataSets"]; XmlElement xeDataSet = (XmlElement)root.SelectSingleNode(string.Format("def:DataSet[@Name='{0}']", dataSetName), nsmgr); if (xeDataSet == null)
{
/*
<DataSet Name="DataM">
<Query>
<DataSourceName>
</DataSourceName>
<CommandText>
</CommandText>
</Query>
<Fields>
<Field Name="zz">
<DataField>zz</DataField>
<TypeName>System.String</TypeName>
</Field>
</Fields>
</DataSet>
*/ XmlElement xenDataSet = xmlDoc.CreateElement("DataSet", nspDef);
xenDataSet.SetAttribute("Name",dataSetName); XmlElement xenQuery = xmlDoc.CreateElement("Query", nspDef);
XmlElement xenDataSourceName = xmlDoc.CreateElement("DataSourceName", nspDef);
XmlElement xenCommandText = xmlDoc.CreateElement("CommandText", nspDef);
xenQuery.AppendChild(xenDataSourceName);
xenQuery.AppendChild(xenCommandText); XmlElement xenFields = xmlDoc.CreateElement("Fields", nspDef);
XmlElement xenField = xmlDoc.CreateElement("Field", nspDef);
xenField.SetAttribute("Name", parameterName); XmlElement xenDataField = xmlDoc.CreateElement("DataField", nspDef);
xenDataField.InnerXml = parameterName; XmlElement xenTypeName = null;
if (dataSetName == "Data")
xenTypeName = xmlDoc.CreateElement("rd", "TypeName", nspRd); //名为"Data"的数据集用的是有前缀的命名空间
else
xenTypeName = xmlDoc.CreateElement("TypeName", nspDef); xenTypeName.InnerXml = parameterType;//"System.String"; xenField.AppendChild(xenDataField);
xenField.AppendChild(xenTypeName); xenFields.AppendChild(xenField); xenDataSet.AppendChild(xenQuery);
xenDataSet.AppendChild(xenFields); root.AppendChild(xenDataSet);
}
else
{ XmlElement xeFields = (XmlElement)xeDataSet.SelectSingleNode(string.Format("def:Fields"), nsmgr); XmlElement book1 = (XmlElement)xeFields.SelectSingleNode(string.Format("def:Field[@Name='{0}']", parameterName), nsmgr); //DataSet Field 部分的处理
if (book1 == null)
{
book1 = xmlDoc.CreateElement("Field", nspDef);
book1.SetAttribute("Name", parameterName); XmlElement objNodeChild = xmlDoc.CreateElement("DataField", nspDef);
objNodeChild.InnerXml = parameterName; book1.AppendChild(objNodeChild); XmlElement objNodeChildTypeName = null;
if (dataSetName == "Data")
objNodeChildTypeName = xmlDoc.CreateElement("rd", "TypeName", nspRd); //名为"Data"的数据集用的是有前缀的命名空间
else
objNodeChildTypeName = xmlDoc.CreateElement("TypeName", nspDef); objNodeChildTypeName.InnerXml = parameterType;//"System.String"; book1.AppendChild(objNodeChildTypeName); xeFields.AppendChild(book1);
} } } //4.保存文件
xmlDoc.Save(rdlFilePath); #endregion
}

zzz

更新RDL文件中的数据集(DataSets)的更多相关文章

  1. python更新zip文件中文件

    #更新zip文件中某一个文件import os import shutil import tempfile import zipfile from rat_tool.pack import * too ...

  2. reporting services rdl文件如何不分页

    进入rdl文件中的xml内容,找到<page></page>标签,在该标签中,添加如下属性, <InteractiveHeight>0in</Interact ...

  3. C#程序中:如何修改xml文件中的节点(数据)

    要想在web等程序中实现动态的数据内容给新(如网页中的Flash),不会更新xml文件中的节点(数据)是远远不够的,今天在这里说一个简单的xml文件的更新,方法比较基础,很适合初学者看的,保证一看就懂 ...

  4. cocos2dx中android下动态更新.so文件

    作者:HU 转载请注明,原文链接:http://www.cnblogs.com/xioapingguo/p/4037595.html  因为没用lua脚本写游戏,所以每次发布出去后,发现在bug,需要 ...

  5. 使用命令动态更新JAR包中的文件

    动态更新JAR包中的文件,经本人实际测试可正常执行! 一.查询jar包中要替换的文件位置 jar  -tvf  gateway.jar  |  grep  topjui.config.js 二.在当前 ...

  6. update-help : 无法更新带有 UI 区域性 {zh-CN} 的模块“WindowsUpdateProvider”帮助: 在 HelpInfo XML 文件中检索不到 UI 区域性 zh-CN

    环境 OS: Windows10 企业版 LTSC x64 CPU: Intel i5-7500 CPU 3.4GHz PowerShell:5.1.17763.503 描述 更新powershell ...

  7. 机器学习数据集,主数据集不能通过,人脸数据集介绍,从r包中获取数据集,中国河流数据集

    机器学习数据集,主数据集不能通过,人脸数据集介绍,从r包中获取数据集,中国河流数据集   选自Microsoft www.tz365.Cn 作者:Lee Scott 机器之心编译 参与:李亚洲.吴攀. ...

  8. TF从文件中读取数据

    从文件中读取数据 在TensorFlow中进行模型训练时,在官网给出的三种读取方式,中最好的文件读取方式就是将利用队列进行文件读取,而且步骤有两步: 把样本数据写入TFRecords二进制文件 从队列 ...

  9. Android manifest文件中的标签详细介绍

    官方文档 概要 每一个Android应用都应该包含一个manifest文件,即AndroidManifest.xml.它包含了程序运行的一些必备信息,比如:--为Java应用程序指定一个独一无二的名字 ...

随机推荐

  1. Applet再学习

    ZLYD团队Apllet学习笔记 Applet再学习 Applet是什么? Applet又称为Java小应用程序,是能够嵌入到一个HTML页面中,并且可通过Web浏览器下载和执行的一种Java类 .A ...

  2. Window 常用系统变量

    转载:http://www.slyar.com/blog/envionment-variables.html 转载:http://blog.csdn.net/wuliusir/article/deta ...

  3. hyper-v安装虚拟机ubuntu 18.04 64bit后无法使能增强模式怎么办

    1.获取脚本来使能增强模式 $ sudo apt-get update $ sudo apt install git $ git clone https://github.com/jterry75/x ...

  4. Net Quartz使用

    安装Quartz 已经先安装了2.5版本,现在换成2.4 程序包管理器控制台: PM> Install-Package Quartz -Version 2.4 正在尝试收集与目标为“.NETFr ...

  5. Java知识弥补-Android开发

    目录 数据结构 1. Map-HashMap 2. StringBuilder 3. List-ArrayList 4. Vector 5. Stack 6. Set 由于这学期开了android课程 ...

  6. pickle & cPickle ValueError: unsupported pickle protocol: 3

    pickle and cPickle pickle和cPickle是python对象的转储文件,保存的是python对象 他们分别是python2和python3的对应部分,建议引入的时候采用以下方法 ...

  7. nyoj1273 河南省第九届省赛_"宣传墙"、状压DP+矩阵幂加速

    宣传墙 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 ALPHA 小镇风景美丽,道路整齐,干净,到此旅游的游客特别多.CBA 镇长准备在一条道路南 面 4*N 的墙上做 ...

  8. IOS-网络(大文件下载)

    一.不合理方式 // // ViewController.m // IOS_0131_大文件下载 // // Created by ma c on 16/1/31. // Copyright © 20 ...

  9. SpringBoot 使用 EhCache2.x 缓存(三十一)

    SpringBoot 使用 EhCache2.x 缓存入门很简单,废话少说上干货: 1.在POM.xml中增加jar包 <!--开启 cache 缓存--> <dependency& ...

  10. 返回值为 Record类型的函数 初始化 Result

    function TMiTeC_Storage.GetPhysInfo(Index: integer): TDeviceInfo; begin Finalize(Result); FillChar(R ...