解决创建带有NameSpace的XML文件出现空白xmlns的问题
为了能够让用户自行部署ClickOnce应用程序,需要编写一个生成ClickOnce应用程序的ClickOnce专用安装程序setup.exe,而生成这个setup.exe的方法就是编写一个XML格式的生成配置文件,使用MSBuild.exe来创建。
一般情况下,创建XML文件本来是个很简单的事情,用XDocument、XElement、XAttribute一顿Add,然后Save成文件就完成了。但是创建setup.exe用的XML文件的根节点(Project)必须指定XML名称空间"http://schemas.microsoft.com/developer/msbuild/2003",形式如下:
- <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup>
- <BootstrapperFile Include=".NETFramework,Version=v4.0">
- <ProductName>Microsoft .NET Framework 4 (x86 和 x64)</ProductName>
- </BootstrapperFile>
- <BootstrapperFile Include="Microsoft.Windows.Installer.3.1">
- <ProductName>Windows Installer 3.1</ProductName>
- </BootstrapperFile>
- </ItemGroup>
- <Target Name="BuildBootstrapper">
- <GenerateBootstrapper
- ApplicationFile="MyApp.application"
- ApplicationName="我的应用程序"
- ApplicationUrl="http://192.168.0.8/MyApp/"
- BootstrapperItems="@(BootstrapperFile)"
- CopyComponents="false"
- OutputPath="."
- Path="X:\SerupExeBuilder\Packages"/>
- </Target>
- </Project>
于是,生成该XML的代码则写为:
- #region ItemGroup
- XElement itemGroup = new XElement("ItemGroup",
- new XElement("BootstrapperFile",
- new XAttribute("Include", ".NETFramework,Version=v4.0"),
- new XElement("ProductName", "Microsoft .NET Framework 4 (x86 和 x64%)")),
- new XElement("BootstrapperFile",
- new XAttribute("Include", "Microsoft.Windows.Installer.3.1"),
- new XElement("ProductName", "Windows Installer 3.1"))
- );
- #endregion
- #region Target
- XElement target = new XElement("Target");
- target.Add(new XAttribute("Name", "BuildBootstrapper"));
- XElement generateBootstrapper = new XElement("GenerateBootstrapper");
- generateBootstrapper.Add(new XAttribute("ApplicationFile", applicationFile));
- generateBootstrapper.Add(new XAttribute("ApplicationName", applicationName));
- generateBootstrapper.Add(new XAttribute("ApplicationUrl", applicationUrl));
- if (componentsLocation == )
- {
- generateBootstrapper.Add(new XAttribute("ComponentsLocation", "Relative"));
- }
- else if (componentsLocation == && !string.IsNullOrWhiteSpace(componentsUrl))
- {
- generateBootstrapper.Add(new XAttribute("ComponentsLocation", "Absolute"));
- generateBootstrapper.Add(new XAttribute("ComponentsUrl", componentsUrl));
- }
- generateBootstrapper.Add(new XAttribute("BootstrapperItems", "@(BootstrapperFile)"));
- generateBootstrapper.Add(new XAttribute("CopyComponents", false));
- generateBootstrapper.Add(new XAttribute("OutputPath", outputPath));
- string packagesPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
- generateBootstrapper.Add(new XAttribute("Path", Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)));
- target.Add(generateBootstrapper);
- #endregion
- XNamespace xmlns = "http://schemas.microsoft.com/developer/msbuild/2003";
- XElement root = new XElement(xmlns + "Project");
- root.Add(itemGroup);
- root.Add(target);
- XDocument setupDocument = new XDocument();
- setupDocument.Add(root);
- setupDocument.Declaration = new XDeclaration("1.0", "UTF-8", "yes");
- setupDocument.Save(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "setup.xml"));
但是生成的XML文件中,ItemGroup和Target节点上会出现 xmlns="" 的属性,而这在编译的时候是不允许的(也是错误的),而又没有办法不让它们出现。
这个问题郁闷了一阵子,也没找到资料,最后用土办法,也就是StringBuilder手工创建,程序是成功了,但是这个问题一直耿耿于怀。
今天终于知道原因了,当然也知道了“解决办法”了。
其实原因是,在XML中,如果某个节点使用了NameSpace,则要求其下的每个节点都必须指定NameSpace的,以便于区分各个节点属于哪一个NameSpace。在生成XML文件的时候,如果子节点的NameSpace与父节点相同,则忽略xmlns属性。所以在创建子节点的时候,必须为子节点指定NameSpace,否则就会因为没有指定NameSpace,出现 xmlns="" 的情况。
所以是对XML的NameSpace了解的不够,才导致程序的错误写法。因此,改为正确的写法,问题自然就消失不见了。当然,这个实际上不能称为“解决办法” 。
另外,该setup.exe也可以使用Microsoft.Build.Tasks.GenerateBootstrapper生成,但是目前只做到生成,尚未进行实践验证。
解决创建带有NameSpace的XML文件出现空白xmlns的问题的更多相关文章
- 用python解决打标签时将xml文件的标签名打错
用python解决打标签时将xml文件的标签名打错 问题描述:再进行达标签时将magnetic_tile的标签名错误的打成了magnetic_title,又不想一张一张的修改 出现问题的xml文件 & ...
- dom4j: 生成的XML文件根节点 xmlns="" 的问题
使用dom4j写入XML文件时,写入完毕后发现root element中没有 xmlns,也即是没有命名空间. 正确的写法如下: Document document = DocumentHelper. ...
- 解决Android工程里的xml文件自动提示问题
昨天晚上看某培训机构的Android的 视频教程,看到他在写布局的XML文件时,有很方便的自动提示功能.我就在自己的Eclipse里试了一下,可是我的没实现.就到网上查,很多都说:在 Window-& ...
- 解决Maven项目中pom.xml文件报错(Failure to transfer....)的问题
打开pom.xml文件,查看错误,如果错误类型为:Failure to transfer.........之类的,则表明你的pom中依赖的jar包没有完全下载. 解决方法:找到你本地的maven仓库, ...
- 我来说说XML文件中的xmlns、xmlns:xsi和xsi:schemaLocation、dtd文件的具体含义
文章摘自:https://yq.aliyun.com/articles/40353 http://www.cnblogs.com/zhao1949/p/5652167.ht ...
- 关于spring xml文件中的xmlns,xsi:schemaLocation(转)
使用spring也有一段时间了,配置文件也见了不少了,但是发现配置文件的beans里面有很多链接,一开始也很迷惑,所以抽了一点时间整里了一下. 首先我们看到的一个spring的配置文件大概如下面这个样 ...
- 关于spring xml文件中的xmlns,xsi:schemaLocation
链接:https://blog.csdn.net/u010571844/article/details/50767151 使用spring也有一段时间了,配置文件也见了不少了,但是发现配置文件的bea ...
- 创建SpringBoot项目pom.xml文件第一行报错:Non-parseable POM E:\maven\repository\org\springframework\securit
在编辑pom.xml时,第一行有个刺眼红色×,然后在Problems看到这个问题 [ERROR] The build could not read 1 project -> [Help 1]E: ...
- idea 创建项目没有web.xml文件,如何添加
1.首先看下项目工程里面是否有WEB-INF文件夹,没有就创建一个 2.点击 file 选择 project structure 3.选择 facets,点击+号, 选择 web 4.弹出 弹框 选择 ...
随机推荐
- Java数据类型与MySql数据类型对照表
这篇文章主要介绍了Java数据类型与MySql数据类型对照表,以表格形式分析了java与mysql对应数据类型,并简单讲述了数据类型的选择与使用方法,需要的朋友可以参考下 本文讲述了Java数据类型与 ...
- 【Spring】Spring boot多数据源历险记
一.问题描述 笔者根据需求在开发过程中,需要在原项目的基础上(单数据源),新增一个数据源C,根据C数据源来实现业务.至于为什么不新建一个项目,大概是因为这只是个小功能,访问量不大,不需要单独申请个服务 ...
- [z]Windows 下基于 Eclipse 的可视化远程 Linux C/C++ 开发环境搭建
http://blog.csdn.net/lostaway/article/details/8086056 1.简介 Windows 下远程 Linux 开发工具,比较著名的就是 WinGDB 和 M ...
- Scrum 团队成立 -- 软件工程
团队项目选题 : 金融工具:复利计算与投资记录项目继续升级,开发定位明确.功能专注的工具类软件 团队队员 : 蔡舜 , 林宇粲 , 王昕明 , 卢晓洵 团队目标 : 不断完善 团队口号 : 永不 ...
- SQL思维导图
- POJ 1135.Domino Effect Dijkastra算法
Domino Effect Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10325 Accepted: 2560 De ...
- rsyncd.conf
rsyncd.conf 28 Jan 2018 rsyncd.conf(5) 28 Jan 2018 NAME rsyncd.conf - configuration file for rsync i ...
- [Selenium]当DOM结构里面有iFrame,iFrame里面是html,怎么send keys to 里面的body,怎么用Assert进行验证?
我在测试的过程中遇到一个这样的问题,我无法通过CssSelector找到iFrame下边的html: <div id="mailEditorDiv" style=" ...
- dotnet core 发布环境变量配置 dev/stage/prod
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/environments?view=aspnetcore-2.2 https://d ...
- js replace 用法
/g 表示全部 global 在很多项目中,我们经常需要使用JS,在页面前面对前台的某些元素做做修改,js 的replace()方法就必不可少. 经常使用"ABCABCabc". ...