2011-02-28 3 views
6

के साथ सर्जिकल एक्सएमएल संपादन मैं परियोजना संदर्भों के बड़े पैमाने पर संपादन करने के लिए पावरहेल का उपयोग कर csproj फ़ाइलों के साथ काम कर रहा हूं। अब तक मैं निम्नलिखित लाइनों का उपयोग कर ProjectReferences पर शामिल विशेषताओं को संपादित करने में कामयाब रहे है:पावरहेल

$projectXml = [xml](Get-Content $_.Project.FullName) 
    Add-TfsPendingChange -edit $_.Project.FullName -ErrorAction Stop 
    $projectXml | Select-Xml -namespace @{msb = "http://schemas.microsoft.com/developer/msbuild/2003"} -xpath "//msb:ProjectReference[msb:Project='$projectGuid']" | Select-Object -ExpandProperty Node | foreach { $_.Include = "$newPath" } 
    $projectXml.Save($_.Project.FullName) 

यह काम करता है, और उचित ProjectReferences पर विशेषता शामिल के रूप में मैं उम्मीद बदल देता है। हालांकि, बहुत सारे अतिरिक्त "हानिरहित" परिवर्तन किए गए हैं, जैसे कि सभी टैग को अपनी लाइन पर स्वरूपित करना, उदा।
<FileUpgradeFlags></FileUpgradeFlags>

<FileUpgradeFlags>
</FileUpgradeFlags>

इस तरह यह इन साइड इफेक्ट भी नहीं है कि के रूप में एक संपादन प्रदर्शन करने के लिए कोई तरीका है हो जाता है?

संपादित करें: जो अन्य कारणों के लिए इस पोस्ट पाता है, का चयन करें-MsBuildXml सिर्फ एक आवरण समारोह मैं चारों ओर का चयन-Xml ने लिखा है कि पूर्व लोड करता है MSBuild नाम स्थान के साथ नाम स्थान पैरामीटर है, और बाद में नोड संपत्ति का विस्तार किसी को स्पष्टता के लिए ।

+0

मुझे यह जानकर उत्सुकता है कि अतिरिक्त व्हाइटस्पेस आपके लिए एक समस्या क्यों उत्पन्न करता है। –

+1

मुख्य रूप से क्योंकि यह परिवर्तनों की समीक्षा में अतिरिक्त कार्य करता है, और यह भी क्योंकि यह स्रोत नियंत्रण में अनावश्यक मंथन बनाता है। पैथोलॉजिकल मामले में, वीएस इन सभी पंक्ति-टूटे हुए टैग को सिंगल-लाइन तत्वों में दोबारा सुधारने का विकल्प चुनता है, इस प्रकार अगली बार सीएसपीआरजे दस्तावेज़ में बदलाव किया जाता है, और दोनों एक परेशान प्रारूप में बंद हो जाते हैं। – bwerks

+1

यह उत्तर दूसरों के लिए अधिक लागू करने के लिए Select-MsBuildXml के बजाय चयन-एक्सएमएल के साथ किया जा सकता है (और दिखाया गया)? –

उत्तर

12

मैंने कुछ साल पहले बहुत सारे वीएस प्रोजेक्ट मैनिपुलेशन किया था। XmlDocument बनाने और लोड सीधे का उपयोग कर की तरह लगता है (Get-सामग्री का उपयोग कर और XML के लिए कास्टिंग बनाम) मेरे लिए बेहतर काम किया:

$path = "C:\temp\foo.csproj" 
$proj = new-object system.xml.xmldocument 
$proj.PreserveWhitespace = $true 
$proj.Load($path) 
... 
$proj.Save($path) 

अद्यतन - दिखाया गया है XML दस्तावेज़ लोड करने से पहले सही पर PreserveWhitespace संपत्ति सेट करने का प्रयास ऊपर।

+0

संकेत के लिए धन्यवाद, लेकिन दुर्भाग्यवश ऐसा लगता है कि परिणाम वही है। उम्मीद है कि वीएस गैर मानक प्रारूपण के साथ सौम्य होगा। – bwerks

+1

मैंने XmlDocument पर 'PreserveWhitespace' प्रॉपर्टी को सेट करने के लिए उत्तर अपडेट किया। यह मदद करने के लिए प्रतीत होता है। –

+0

सबसे बढ़िया! यह मुझे बहुत सी समीक्षा सिरदर्द बचाएगा। आपका बहुत बहुत धन्यवाद! – bwerks