2011-06-01 83 views
0

我将开始与代码...从元素中删除属性

private static void File() 
{ 
    wixFile = XDocument.Load(filePath); 

    var fileElements = from file in wixFile.Descendants(GetWixNamespace() + "File") 
         select file; 
    foreach (var file in fileElements) 
    { 
     if(file.Attributes("Name").Any()) 
      file.Attribute("Name").Remove(); 
    } 
    wixFile.Save(filePath); 
} 

我实际检查列表中的相当多的属性,并删除或纠正,但只是为了保持短我把一切除了我正在做的一个例子。我遇到的问题是这段代码并没有像我期望的那样去除Name属性。当我放入一个中断点并观察它时,“文件”会按预期更新,但当我保存(或在编辑期间)时,这些更改不会转移到wixFile。我不完全确定我在这里失踪,所以任何帮助将不胜感激。

编辑:

下面是代码的片段,正在改变:

<?define ApplicationPath=\\dwdata\develope\DocuWare\DW5\Mast_dsk\?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
<Directory Id="DATADIR" Name="data"> 
          <Directory Id="mysql" Name="mysql"> 
           <Component Id="procs_priv.MYI" Guid="{1148181A-4818-434F-B2D1-E4B417586168}"> 
            <File Id="procs_priv.MYI" Name="procs_priv.MYI" KeyPath="yes" Source="$(var.ApplicationPath)Common\MySql\Server\data\mysql\procs_priv.MYI" /> 
           </Component> 
           <Component Id="procs_priv.MYD" Guid="{A6688F48-71AF-4242-B6D0-CA69452A01B4}"> 
            <File Id="procs_priv.MYD" Name="procs_priv.MYD" KeyPath="yes" Source="$(var.ApplicationPath)Common\MySql\Server\data\mysql\procs_priv.MYD" /> 
           </Component> 
           <Component Id="procs_priv.frm" Guid="{3025C26C-8DFF-43D4-A62A-79E78D2D807D}"> 
            <File Id="procs_priv.frm" Name="procs_priv.frm" KeyPath="yes" Source="$(var.ApplicationPath)Common\MySql\Server\data\mysql\procs_priv.frm" /> 
           </Component> 
           <Component Id="proc.MYI" Guid="{FD4AA2E1-E059-4549-AE61-222878185A0A}"> 
            <File Id="proc.MYI" Name="proc.MYI" KeyPath="yes" Source="$(var.ApplicationPath)Common\MySql\Server\data\mysql\proc.MYI" /> 
           </Component> 
           <Component Id="proc.MYD" Guid="{12EE6EE8-AC44-4601-84C5-14B27CF9A3E6}"> 
            <File Id="proc.MYD" Name="proc.MYD" KeyPath="yes" Source="$(var.ApplicationPath)Common\MySql\Server\data\mysql\proc.MYD" /> 
           </Component> 
           <Component Id="proc.frm" Guid="{8A6F2928-5484-4B55-B75F-8475C684A091}"> 
            <File Id="proc.frm" Name="proc.frm" KeyPath="yes" Source="$(var.ApplicationPath)Common\MySql\Server\data\mysql\proc.frm" /> 
           </Component> 
</Directory> 
</Directory> 
</Wix> 

我收到回完全相同的为好。我想要做的是删除“名称”属性,但它只是不工作,无论出于何种原因。 GetWiXNamespace()方法返回wix元素中列出的与XNamespace相同的名称空间。

+1

考虑发布足够的信息以便我们轻松地重现问题。因此,向我们展示您阅读的XML示例,向我们展示GetWixNamespace()返回的内容,然后展示您想要的XML示例以及您当前获得的XML示例。 – 2011-06-01 15:28:37

+0

问题已回答,但我仍然添加了您请求的信息。 – Adkins 2011-06-03 07:54:05

回答

2

我打算在这里读一行,猜测你是从一个需要File @ Name属性的老版本的WiX(比如说2.0)转换为可以推断出这个属性的版本(比如3.0-3.6)并不需要它。

下面是我刚刚提到的一些代码,我知道这些代码假设源xml是WiX 3.x.我不确定你的代码有什么问题,但是可能返回这个命名空间的方法并没有考虑到URL的改变。

XNamespace ns = "http://schemas.microsoft.com/wix/2006/wi"; 
    var doc = XDocument.Load(@"C:\before.wxs"); 
    var elements = from element in doc.Descendants(ns + "File") 
        where element.Attribute("Name") != null 
        select element; 

    foreach (var element in elements) 
    { 
     element.Attribute("Name").Remove(); 
    } 
    doc.Save(@"C:\after.wxs"); 


<?xml version="1.0" encoding="utf-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <?define SourceDir="."?> 
    <Module Id="YourModuleHere" Language="1033" Version="1.0.0.0"> 
    <Package Id="31c7722e-c2a0-4328-92a2-eacd443c10a9" Manufacturer="YourCompanyHere" InstallerVersion="200" /> 
    <Directory Id="TARGETDIR" Name="SourceDir"> 
     <Directory Id="MergeRedirectFolder"> 
     <Component Id="owc7CEF9B0C53324FC23404D2AAAB5D12B8" Guid="6898e947-fa51-8efb-bda4-2e256dea8ed1"> 
      <File Id="owf7CEF9B0C53324FC23404D2AAAB5D12B8" Name="bfsvc.exe" Source="$(var.SourceDir)\Windows\bfsvc.exe" KeyPath="yes" /> 
     </Component> 
     <Component Id="owc8C6EA26177072C0006EEF8265FEF72A4" Guid="91737806-0b20-24ad-9653-cca05b5778fb"> 
      <File Id="owf8C6EA26177072C0006EEF8265FEF72A4" Name="explorer.exe" Source="$(var.SourceDir)\Windows\explorer.exe" KeyPath="yes" /> 
     </Component> 
     </Directory> 
    </Directory> 
    </Module> 
</Wix> 
+0

谢谢!只是出于好奇,检查element.Attribute(“Name”)!= Null和element.Attributes(“Name”)。Any()是有区别的吗? – Adkins 2011-06-03 07:53:36

+0

说实话,有很多方法来编写不同程度的精彩的LINQ查询,我只是在“完成”级别。这是一种奇特的说法,我不知道我还不知道什么。 – 2011-06-03 12:16:40

+0

不错。我很欣赏诚实。无论哪种方式,你的解决方案已经帮了我很大的忙。再次感谢! – Adkins 2011-06-03 14:38:56