2011-02-28 11 views
6

Estoy trabajando con archivos csproj usando Powershell para realizar la edición a gran escala de referencias de proyectos. Hasta ahora me las he arreglado para editar los atributos incluyen en ProjectReferences utilizando las siguientes líneas:Edición XML quirúrgica con Powershell

$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) 

Esto funciona, y reemplaza el atributo en los ProjectReferences adecuadas se pueden citar como espero. Sin embargo, hay muchos cambios adicionales "inofensivos" realizados, como formatear todas las etiquetas en su propia línea, p.
<FileUpgradeFlags></FileUpgradeFlags>

convierte

<FileUpgradeFlags>
</FileUpgradeFlags>

¿Hay alguna manera de realizar una edición como este que no tiene estos efectos secundarios? editar: para que cualquier persona que encuentre esta publicación tenga alguna otra razón, Select-MsBuildXml es solo una función de envoltura que escribí alrededor de Select-Xml que precarga el parámetro de espacio de nombres con el espacio de nombres msbuild y luego expande la propiedad del nodo .

+0

Tengo curiosidad por saber por qué el espacio en blanco adicional representa un problema para usted. –

+1

Principalmente porque crea un trabajo adicional en la revisión de los cambios, y también porque crea un abandono innecesario en el control de la fuente. En el caso patológico, VS elegiría volver a formatear todas estas etiquetas divididas en líneas en elementos de una línea, revolviendo todo de nuevo la próxima vez que se realice un cambio en el documento csproj, y las dos se bloqueen en un ataque de formato irritante. – bwerks

+1

¿Podría hacerse (y mostrarse) con Select-XML en lugar de Select-MsBuildXml para que esta respuesta sea más aplicable a otras? –

Respuesta

12

Hice un montón de manipulación de proyectos VS hace unos años. Parece que la creación de la XmlDocument y directamente a través de la carga (en comparación con el uso de Get-Content y expulsando a XML) funcionó mejor para mí:

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

actualización - Trate de establecer la propiedad PreserveWhitespace true antes de cargar el documento XML, como se muestra encima.

+0

Gracias por la pista, pero desafortunadamente parece que el resultado es el mismo. Con suerte VS será suave con el formato no estándar. – bwerks

+1

Actualicé la respuesta para incluir la configuración de la propiedad 'PreserveWhitespace' en XmlDocument. Esto parece ayudar. –

+0

¡Más excelente! Esto me ahorrará muchos dolores de cabeza de revisión. ¡Muchas gracias! – bwerks

Cuestiones relacionadas