スポンサーリンク

C++で .vcxproj , .csproj を解析・書き換え

.vcxprojとcsprojはxmlなので、pugixmlで内容を解析できる。例えばプロジェクト名を変えてみる。

#include <iostream>
#include <fstream>

#include "pugixml.hpp"

// vcxprojファイルへのアクセスと編集
void vcxproj(std::string vcxproj_path) {
    pugi::xml_document doc;

    doc.load_file(vcxproj_path.c_str());

    pugi::xml_node property_group;
    pugi::xml_node project = doc.child("Project");
    for (pugi::xml_node node : project.children("PropertyGroup")) {
        if (node.attribute("Label") && std::string(node.attribute("Label").value()) == "Globals") {
            property_group = node;
            break;
        }
    }

    // プロジェクト名を取得
    pugi::xml_node root_namespace = property_group.child("RootNamespace");
    std::cout << root_namespace.child_value();

// プロジェクト名を編集 root_namespace.text().set("MyNewProjectName"); doc.save_file(vcxproj_path.c_str()); }

// csprojファイルへのアクセスと編集
void csproj(std::string csproj_path) {
    pugi::xml_document doc;

    doc.load_file(csproj_path.c_str());

    pugi::xml_node project = doc.child("Project");
    pugi::xml_node root_namespace;

    for (pugi::xml_node node : project.children("PropertyGroup")) {
        pugi::xml_node candidate = node.child("RootNamespace");
        if (candidate) {
            root_namespace = candidate;
            break;
        }
    }

    // プロジェクト名を取得
    std::cout << root_namespace.text().as_string() << std::endl;

    // プロジェクト名を編集
    root_namespace.text().set("MyNewProjectName");

    doc.save_file(csproj_path.c_str());

}

int main()
{
    std::string cs_proj_path = R"(C:\test\ConsoleApp1-SCharpProj\ConsoleApp1-SCharpProj.csproj)";
    std::string vc_proj_path = R"(C:\test\ConsoleAppl-CPPProj\ConsoleAppl-CPPProj.vcxproj)";

    csproj(cs_proj_path);
    vcxproj(vc_proj_path);

}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: