删除appendChild添加的不需要的(空)xmlns属性

Com*_*eek 18 xml powershell dom appendchild

我有这个代码:

function setupProject($projectFile) {
  [xml]$root = Get-Content $projectFile;

  $project = $root.Project;

  $beforeBuild = $root.CreateElement("Target", "");
  $beforeBuild.SetAttribute("name", "BeforeBuild");
  $beforeBuild.RemoveAttribute("xmlns");
  $project.AppendChild($beforeBuild);

  $root.Save($projectFile);
}
Run Code Online (Sandbox Code Playgroud)

应该<Target name="BeforeBuild" />为XML文档添加一个新内容.

但它也添加了一个xmlns=""我不想要的空属性.(它实际上是Visual Studio,它不喜欢这个属性!)

<Target name="BeforeBuild" xmlns="" />
Run Code Online (Sandbox Code Playgroud)

我已经尝试过这段代码:

$beforeBuild.RemoveAttribute("xmlns");
$project.AppendChild($beforeBuild);
$beforeBuild.RemoveAttribute("xmlns");
Run Code Online (Sandbox Code Playgroud)

Mic*_*Kay 24

添加了xmlns =""命名空间(un)声明,因为您的父元素位于命名空间中而您的子元素不在.如果您不希望添加此命名空间声明,则暗示您希望子元素与其父元素位于相同的命名空间中,答案是在创建元素时将其放在此命名空间中.也就是说,更改调用CreateElement("Target","")以指定正确的命名空间.

  • 更好的答案 - 通过指定正确的命名空间来解决问题,然后它会消失(因为它是冗余信息) (4认同)
  • 但是我在(直接)父元素上没有任何命名空间。只有根元素 `&lt;Project&gt;` 有一个:`xmlns="http://schemas.microsoft.com/developer/msbuild/2003"`。那么我应该将此值传递给`CreateElement()`吗? (2认同)
  • 是的,您应该为新元素提供与项目根元素相同的命名空间。否则,它会添加 xmlns 属性,因为命名空间与父命名空间不同。 (2认同)

Neo*_*isk 12

检查这些可能的解决方案:

Powershell和csproj

Xml命名空间和C#csproj

以下是适用于OP的第二个解决方案的解决方法:

$content = [xml] $content.OuterXml.Replace(" xmlns=`"`"", "")
$content.Save($_.FullName);
Run Code Online (Sandbox Code Playgroud)

  • 答案不好 - 它可能有效,但它表明了对问题原因的根本误解. (6认同)
  • 感谢您的链接!第二种解决方案对我有用。您能否将代码段插入答案中?这对其他用户将非常有帮助。 (2认同)
  • @MichaelKay:错误的态度-一个有效的答案是一个很好的答案。如果您可以提出更好的建议,请继续(您已经这样做了)。 (2认同)

eme*_*ekm 8

正如Michael Kay回答的那样,删除此不需要的名称空间的最佳方法是在与其父元素相同的名称空间中创建新的子元素:

function setupProject($projectFile) {
  [xml]$root = Get-Content $projectFile;

  $project = $root.Project;

  //UPDATE THIS LINE $beforeBuild = $root.CreateElement("Target", "");
  $beforeBuild = $root.CreateElement("Target", $project.NamespaceURI);
  $beforeBuild.SetAttribute("name", "BeforeBuild");
  $beforeBuild.RemoveAttribute("xmlns");
  $project.AppendChild($beforeBuild);

  $root.Save($projectFile);
}
Run Code Online (Sandbox Code Playgroud)