Linq to xml 操作带命名空间的xml

 昨天需要操作用代码操作csproj文件,实现不同vs版本的切换。

在用XElement读取了csproj文件以后怎么也获取不到想要的对象。

反反复复试验了好多次都不得要领:先看下csproj文件的内容:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{EC9D3364-405E-4931-8148-779183C72A40}</ProjectGuid>
    <OutputType>Exe</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>AsyncDemo</RootNamespace>
    <AssemblyName>AsyncDemo</AssemblyName>
    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>

</Project>

因为只是为了说明问题,我只截取了一部分csproj文件

我最初的代码是:

XDocument doc = XDocument.Load(@"D:\Demo\AsyncDemo\AsyncDemo\AsyncDemo.csproj");
XElement x = doc.Element("Project");

这个x始终为空,最后分析了下doc对象

果然找到了玄机,这个name并不是一个单纯“project”,还带有命名空间。

那么如何获得这个带有Namespace的节点名哪?

好吧,让我们回过头来看看XElement的构造函数:

public XElement(XName name); 注意哦,参数的类型是XName,而不是string,那么平时为什么能用string哪?XName定义了一个隐式的转换,可以把string隐式的转换成XName。

所以,关于Namespace自然也要从XNamespace入手,然后找一个能够变成XName的方法,察看XNamespace的定义,就可以看到:

public static XName operator +(XNamespace ns, string localName); 只要把XNamespace加上本地名称(string),就是一个XName了,非常简单。

再看看如何创建一个XNamespace:

public static implicit operator XNamespace(string namespaceName); 又是隐式转换。。。来看看具体如何创建一个带namespace的project吧:

 static void TestXml()
        {
            XDocument doc = XDocument.Load(@"D:\Demo\AsyncDemo\AsyncDemo\AsyncDemo.csproj");
            XNamespace v = "http://schemas.microsoft.com/developer/msbuild/2003";
            XElement x = doc.Element(v + "Project");
        }

 定义一个namespace,在使用时直接+string即可。这样就可以得到我们想要的对象了,具体操作代码如下:

 static void TestXml()
        {
            string path = @"D:\Demo\AsyncDemo\AsyncDemo\AsyncDemo.csproj";
            XDocument doc = XDocument.Load(path);
            XNamespace v = "http://schemas.microsoft.com/developer/msbuild/2003";
            var x = doc.Element(v + "Project").Elements(v+"PropertyGroup");
            foreach (var e in x)
            {
                XElement element = e.Element(v + "AssemblyName");
                if(element!=null)
                {
                    element.SetValue("abcd");
                }
            }
            doc.Save(path);
        }

这里面所有需要操作的节点都要采用命名空间加节点名的方式。

希望对您有所帮助……

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Linux驱动

第1阶段——uboot分析之启动函数bootm命令 (9)

本节主要学习: 详细分析UBOOT中"bootcmd=nand read.jffs2 0x30007FC0 kernel;bootm 0x30007FC0...

1665
来自专栏c#开发者

General Database Adapter for Biztalk Server 2006 介绍

General Database Adapter for Biztalk Server 2006 介绍 目前该adapter分单向的Receive Adapte...

31011
来自专栏大内老A

WCF技术剖析之三十三:你是否了解WCF事务框架体系内部的工作机制?[上篇]

WCF事务编程主要涉及到这么三个方面:通过服务(操作)契约确定TransactionFlow的策略;通过事务绑定实现事务流转;通过服务操作行为控制事务的自动登记...

1948
来自专栏更流畅、简洁的软件开发方式

【自然框架】QuickPager asp.net 分页控件的Ajax分页方式。

  上次比较匆忙,Ajax的分页方式仅实现了基本功能,或者说只是验证了我的想法。现在对Ajax分页有做了一些调整,现在可以正式用了。   使用方法还是非常简单,...

2257
来自专栏乐沙弥的世界

PL/SQL-->UTL_FILE包的使用介绍

    在PL/SQL中,UTL_FILE包提供了文本文件输入和输出互功能。也就是说我们可以通过该包实现从操作系统级别来实现文件读取输入或者是写入到操作系统文件...

471
来自专栏沃趣科技

复制状态与变量记录表 | performance_schema全方位介绍

不知不觉中,performance_schema系列快要接近尾声了,今天将带领大家一起踏上系列第六篇的征程(全系共7个篇章),在这一期里,我们将为大家全面讲解p...

1223
来自专栏攻城狮的动态

iOS面试题梳理(三)

3317
来自专栏沃趣科技

ASM 翻译系列第三十四弹:ASM磁盘组重要属性介绍

原作者:Bane Radulovic 译者: 邱大龙 审核: 魏兴华 DBGeeK社区联合出品 原文链接:http://asmsupportguy....

3176
来自专栏逸鹏说道

在SQL Server里如何进行页级别的恢复

在今天的文章里我想谈下每个DBA应该知道的一个重要话题:在SQL Server里如何进行页级别还原操作。假设在SQL Server里你有一个损坏的页,你要从最近...

2455
来自专栏林德熙的博客

C# 代码占用的空间

是不是代码会占用空间,如果一个程序初始化需要 100M 的代码,那么在他初始化之后,这些代码就没有作用了,他会不会占空间?本文经过测试发现,代码也是会占空间。

271

扫描关注云+社区