代码之家  ›  专栏  ›  技术社区  ›  Arve

我想创建一个操作C项目文件的工具

  •  7
  • Arve  · 技术社区  · 15 年前

    (基本上,我们希望在*.csproj文件的某些位置导入目标文件,否则请检查该文件是否符合我们的标准)

    最好的方法是什么?我计划使用C和xdocument(linq-to-xml)并操纵节点。但这是最好的方法吗?其他备选方案可能是:

    1. 查找csproj/msbuild的xsd,并创建表示项目文件的stronly类型对象。这有可能吗?
    2. 是否还有其他更好的工具/语言(它可以以此作为学习Ruby的借口)。答案必须有一些链接到操作XML的示例。

    也许真正的问题是:什么是编程读取和操作XML的最佳方法?

    4 回复  |  直到 15 年前
        1
  •  5
  •   Jon Skeet    15 年前

    我个人会直接使用linq-to-xml…除非您做的是非常繁重的处理,否则我认为不值得为它创建一个对象模型。这个工具需要多少规则/什么?

        2
  •  5
  •   Sayed Ibrahim Hashimi    15 年前

    MSBuild (项目文件的格式)具有 object model 可用于此类应用程序。

        3
  •  3
  •   Community    7 年前

    我们有一个内部工具,可以动态地操作项目文件,以更新引用并设置各种属性。由于项目文件没有那么复杂,我们只是直接操作XML。这个工具早在Linq出现之前就已经编写好了,所以它不使用它,但是我看不出为什么你不能按照Jon的建议去做。

    当我们从VS2005升级到VS2008时,我们只需要对代码做一些小的调整,但是在这方面当然没有保证。我们可能需要对未来的版本做更大的调整。

    如果你感兴趣的话,在我对这个问题的回答中有更多关于我们工具的信息 Should a .sln be committed to source control?

        4
  •  2
  •   Asad    15 年前

    根据问题的第二部分,如何通过编程操作XML,这里是来自项目配置文件的一些XML。(Web.CONFIG)

     <system.web>
    <compilation debug="false">
    <assemblies>
            <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
            <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            <add assembly="System.Web.Abstractions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            <add assembly="System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            <add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, 
    </compilation>
    </compilation>
    

    并使用 LIQ-XML ,如下所示

    XDocument assemblies = XDocument.Parse("web.config");
    
    var projectAssemblies= from a in assemblies.Descendants("system.web\assemblies")
                   select new  // What ever object you waant
                   {
                       Assembly = a.Attribute("assembly").Value.ToString(),
                       Version = a.Attribute("Version").Value.ToString(),
                       Culture = a.Element("Culture").Value.ToString(),
                       PublicKeyToken = a.Attribute("PublicKeyToken").Value.ToString()
                   };
    
    foreach (var v in projectAssemblies)
    {
        // enjoy them 
    }
    

    希望它有帮助