用 libxml,ruby處理 .vcxproj檔案 和 .vcproj檔案

來源:互聯網
上載者:User

    .vcproj檔案對於visual studio(vc++)使用者來說並不陌生,而.vcxproj是VS2010推出之後,將.vcproj檔案統一改為

.vcxproj,它們都是基於xml的檔案,那麼對它們的解析,有許多庫。這裡我就用libxml。

     我要實現的功能很簡單就是項目中所有的工程加入一個 ignorewarning(消除warning),比如/ignore:4011 。

     這裡就要寫個指令碼對所有的.vcproj(vs2008以前的版本)或 所有的.vcxproj(vs2010)添加/ignor:4011 。

    這裡要特別小心的是:用libxml庫對.vcxproj進行解析要給解析的節點(node)加上預設的命名空間首碼,而對.vcproj

不需要這樣 。

    還有一點:加/ignore:4011的位置,.vcxproj和.vcproj是不一樣的。對於具體的ignore warning具體分析啊。

   下面我分別給出了對.vcproj和 .vcxproj解析的例子代碼(僅供參考):

# to the .vcproj

require 'libxml'
include LibXMLdef IgnoreWarningAdd(filePath)
  parser = LibXML::XML::Parser.file(filePath)
  doc = parser.parse  doc.find("//Tool").each do |tool|
    puts tool['Name']
    if tool['Name'] == "VCLinkerTool" && tool['AdditionalOptions'] == " "
      tool['AdditionalOptions'] = "/ignore:4011"
    end
  end  doc.save(filePath)
end#recur to find the .vcproj filesdef VcprojWarningAdd(dirPath)
  Dir.entries(dirPath).each do |sub|
   if sub != '.' && sub != '..'
     if File.directory?("#{dirPath}/#{sub}")
       VcprojWarningAdd("#{dirPath}/#{sub}")
     else
       filePath = "#{dirPath}/#{sub}"
       #if /*.vcproj/.match(filePath)        if File.extname(filePath) == '.vcproj'
         IgnoreWarningAdd("#{dirPath}/#{sub}")
       end
     end
    end
  end
end#VcprojWarningAdd("E://vcproj_folders")VcprojWarningAdd(ARGV) #to the .vcxproj require 'libxml'
include LibXML

def IgnoreWarningAdd(filePath)
  document = LibXML::XML::Document.file(filePath)
  root = document.root  # to .vcxproj, need the default namespace prefix to parse the .vcxproj file
  root.namespaces.default_prefix = "parsexml_ns"
  document.find('//parsexml_ns:Link//parsexml_ns:AdditionalOptions').each do |node|
    puts "here I entered"
    node << " /ignore:4011 "  
  end
  document.save(filePath)
end

def VcxprojWarningAdd(dirPath)
  Dir.entries(dirPath).each do |sub|
      if sub != '.' && sub != '..'
        if File.directory?("#{dirPath}/#{sub}")
          VcxprojWarningAdd("#{dirPath}/#{sub}")
        else
          filePath = "#{dirPath}/#{sub}"
          #if /.vcxproj/.match(filePath)          if File.extname(filePath) == '.vcxproj'
            puts filePath
            IgnoreWarningAdd("#{dirPath}/#{sub}")
            puts "here am I: #{dirPath}/#{sub}"
          end
        end
    end
  end
end

#VcxprojWarningAdd("E://vcxproj_folder")

VcxprojWarningAdd(ARGV)
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.