Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从元素中删除属性_C#_Wix_Linq To Xml_Wix3.5 - Fatal编程技术网

C# 从元素中删除属性

C# 从元素中删除属性,c#,wix,linq-to-xml,wix3.5,C#,Wix,Linq To Xml,Wix3.5,我将从代码开始 private static void File() { wixFile = XDocument.Load(filePath); var fileElements = from file in wixFile.Descendants(GetWixNamespace() + "File") select file; foreach (var file in fileElements) {

我将从代码开始

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>


我也得到了完全一样的东西。我想做的是删除“Name”属性,但不管出于什么原因,它都不起作用。GetWiXNamespace()方法返回与XNamespace在wix元素中列出的名称空间相同的名称空间。

我将从这里的行间阅读,并猜测您是从需要File@Name属性的一个版本(例如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>
xns=”http://schemas.microsoft.com/wix/2006/wi";
var doc=XDocument.Load(@“C:\before.wxs”);
var elements=文档子体(ns+“文件”)中的from元素
其中element.Attribute(“Name”)!=无效的
选择元素;
foreach(元素中的var元素)
{
element.Attribute(“Name”).Remove();
}
文件保存(@“C:\after.wxs”);

考虑发布足够的信息,以便我们能够轻松重现问题。给我们看一个你读到的XML示例,给我们看GetWixNamespace()返回的内容,然后给我们看一个你想要的和你当前得到的XML示例。问题已经回答了,但我仍然添加了你要求的信息。谢谢!只是出于好奇,检查element.Attribute(“Name”)!=Null和element.Attributes(“Name”).Any()?老实说,有很多方法可以编写具有不同程度的出色性的LINQ查询,我只是处于“完成”级别。这是一种奇特的说法,我不知道我还不知道什么。很好。我欣赏你的诚实。不管怎样,你的解决方案帮了我大忙。再次感谢!