为了能够让用户自行部署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的问题的更多相关文章

  1. 用python解决打标签时将xml文件的标签名打错

    用python解决打标签时将xml文件的标签名打错 问题描述:再进行达标签时将magnetic_tile的标签名错误的打成了magnetic_title,又不想一张一张的修改 出现问题的xml文件 & ...

  2. dom4j: 生成的XML文件根节点 xmlns="" 的问题

    使用dom4j写入XML文件时,写入完毕后发现root element中没有 xmlns,也即是没有命名空间. 正确的写法如下: Document document = DocumentHelper. ...

  3. 解决Android工程里的xml文件自动提示问题

    昨天晚上看某培训机构的Android的 视频教程,看到他在写布局的XML文件时,有很方便的自动提示功能.我就在自己的Eclipse里试了一下,可是我的没实现.就到网上查,很多都说:在 Window-& ...

  4. 解决Maven项目中pom.xml文件报错(Failure to transfer....)的问题

    打开pom.xml文件,查看错误,如果错误类型为:Failure to transfer.........之类的,则表明你的pom中依赖的jar包没有完全下载. 解决方法:找到你本地的maven仓库, ...

  5. 我来说说XML文件中的xmlns、xmlns:xsi和xsi:schemaLocation、dtd文件的具体含义

    文章摘自:https://yq.aliyun.com/articles/40353               http://www.cnblogs.com/zhao1949/p/5652167.ht ...

  6. 关于spring xml文件中的xmlns,xsi:schemaLocation(转)

    使用spring也有一段时间了,配置文件也见了不少了,但是发现配置文件的beans里面有很多链接,一开始也很迷惑,所以抽了一点时间整里了一下. 首先我们看到的一个spring的配置文件大概如下面这个样 ...

  7. 关于spring xml文件中的xmlns,xsi:schemaLocation

    链接:https://blog.csdn.net/u010571844/article/details/50767151 使用spring也有一段时间了,配置文件也见了不少了,但是发现配置文件的bea ...

  8. 创建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: ...

  9. idea 创建项目没有web.xml文件,如何添加

    1.首先看下项目工程里面是否有WEB-INF文件夹,没有就创建一个 2.点击 file 选择 project structure 3.选择 facets,点击+号, 选择 web 4.弹出 弹框 选择 ...

随机推荐

  1. windows系统如何真正隐藏文件夹[转载]

    方法一(推荐)eg:现需隐藏e盘bak目录下的tools文件夹e:\bak\tools运行:cmd键入:attrib +s +a +h +r e:\bak\tools然后,你再进去看e盘bak目录下, ...

  2. PAT 1064 朋友数(20)(代码)

    1064 朋友数(20 分) 如果两个整数各位数字的和是一样的,则被称为是"朋友数",而那个公共的和就是它们的"朋友证号".例如 123 和 51 就是朋友数, ...

  3. UI设计不就是画线框,凭什么年薪30W?

    作为一枚界面设计师 我真的很想为UI设计抱不平啊!! UI设计真是一个备受不解的职业 常会被误解,然后出现以下场景 程序欧巴: 界面画好没?按钮圆的方的不都能用吗?纠结那多干嘛? 产品经理: 这次我们 ...

  4. OSGi 系列(十八)之 基于注解的 Blueprint

    OSGi 系列(十八)之 基于注解的 Blueprint 1. 注解实现 blueprint 第一步:bundle 添加 Bundle-Blueprint-Annotation <plugin& ...

  5. 原生 JS 实现移动端 Touch 滑动反弹

    什么是 Touch滑动?就是类似于 PC端的滚动事件,但是在移动端是没有滚动事件的,所以就要用到 Touch事件结合 js去实现,效果如下: 1. 准备工作 什么是移动端的 Touch事件?在移动端 ...

  6. 简明PR教程

    注意:本文供培训使用且仅为第一版 作者也不打算继续更新 本篇文章最早是在为内部培训时所编写的文章 有些疏漏且没有进行校正等工作 我尽力用最简单通俗的语言给大家介绍PR的使用方法 简明PR教程 1.编辑 ...

  7. 20155328 2016-2017-2 《Java程序设计》第7周学习总结

    20155328 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 时区 Date与DateFormat Date只用来获取epoch毫秒数 DateForma ...

  8. [原创汉化] 价值990美元的顶级专业数据恢复软件O&O DiskRecovery 11(技术员版)汉化绿色版

    百度没搜索到11有汉化版的,有空就把它汉化了,大部分借鉴的是以前汉化版的词条.另外,顺便做了个二合一的单文件版给有需要的朋友. 运行环境: 可用于 Windows 2000/XP/2003/Vista ...

  9. hdu-1067(最大独立集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1068 题意:一个男生集合和一个女生集合,给出两个集合之间一一对应的关系,求出两个集合中最大独立集的点数 ...

  10. winform 按键控制

    用ADSW来控制前后左右,J表示开火,J不能连续按 _+表示速度档位. DateTime _LastPress = DateTime.MinValue; Keys _PrevKey = Keys.No ...