由于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. 20145221 《Java程序设计》第六周学习总结

    20145221 <Java程序设计>第六周学习总结 教材学习内容总结 第十一章部分 - 输入与输出 文件的读写 网络上传数据的基础 同样要先掌握父类中方法,核心类如下: 以上则是老师提出 ...

  2. OpenCV_火焰检测——完整代码

    转:http://blog.csdn.net/xiao_lxl/article/details/43307993 火焰检测小程序 前几天,偶然看到了An Early Fire-Detection Me ...

  3. UVa 12549 机器人警卫(最小点覆盖)

    https://vjudge.net/problem/UVA-12549 题意: 在一个Y行X列的网格里有空地(.),重要位置(*)和障碍物(#),用最少的机器人看守所有重要位置,每个机器人要放在一个 ...

  4. C#中标准Dispose模式的实现(转载)

    需要明确一下C#程序(或者说.NET)中的资源.简单的说来,C#中的每一个类型都代表一种资源,而资源又分为两类: 托管资源:由CLR管理分配和释放的资源,即由CLR里new出来的对象: 非托管资源:w ...

  5. Rails 5 Test Prescriptions 第10章 Unit_Testing JavaScript(新工具,learn曲线太陡峭,pass)

    对Js的单元测试是一个大的题目.作者认为Ruby的相关测试工具比Js的测试工具更灵活 大多数Js代码最终是关于响应用户的行为和改变DOM中的元素 没有什么javascript的知识点.前两节用了几个新 ...

  6. 使用Bootstrap的suggest下拉插件

    前端代码 /*html代码*/ <input type="text" class="form-control search_ul" id="ca ...

  7. 修复Ubuntu下XTerm不能正常显示中文字体的问题

    打开/etc/X11/app-defaults/XTerm在最后添加如下代码: Xft.dpi:96         xpdf.title: PDF         XTerm*faceSize: 1 ...

  8. PLSQL 触发器

    触发器权限 数据库创建用户时想要在本用户下使用触发器,需要给用户触发器的权限 使用DBA用户执行  GRANT CREATE TRIGGER TO user_name; 如果想在当前用户下创建其他用户 ...

  9. Centos系统更改yum源为163

    Centos安装好之后,按照网上教程对yum源进行修改,但更新之后发现总是提示更新失败,到163网站上查找资源发现目前大部分网上的教程都写错地址了,呵呵 下面是正确的办法,请参考 1.进入存放源配置的 ...

  10. Java 线程面试题 Top 50(转 ImportNew)

    不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程 ...