除去不需要的(空)xmlns属性由加入的appendChild(Remove unwanted (e

2019-08-02 07:20发布

我有这样的代码:

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);
}

应该增加一个新的<Target name="BeforeBuild" />到XML文档。

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

<Target name="BeforeBuild" xmlns="" />

我已经尝试过这样的代码:

$beforeBuild.RemoveAttribute("xmlns");
$project.AppendChild($beforeBuild);
$beforeBuild.RemoveAttribute("xmlns");

Answer 1:

作为回答了迈克尔·凯 ,最好的方法来消除这种不必要的命名空间创建在同一个命名空间作为其父的新的子元素:

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);
}


Answer 2:

该的xmlns =“”命名空间(UN)宣布已经加入,因为你的父元素是一个命名空间,你的子元素是没有的。 如果你不希望添加这个命名空间声明做,言外之意就是你想要的子元素是在同一个命名空间为它的父,得到的回答是把它放在这个命名空间在创建元素的时候。 也就是说,改变通话的createElement(“目标”,“”)指定正确的命名空间。



Answer 3:

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

PowerShell和的csproj

XML命名空间和C#的csproj

下面是从为OP工作的第二个解决方案一种解决方法:

$content = [xml] $content.OuterXml.Replace(" xmlns=`"`"", "")
$content.Save($_.FullName);


Answer 4:

使用JavaScript

声明之后的子节点。如果你正在使用JS创建一个XML文档和越来越空的xmlns属性xmlns="XXXX"父节点上,使用JS createElementNS(namespace, nodeName)来代替createElement(nodeName)

这是假设你希望你的孩子节点共享同一个命名空间作为父。 在下面的情况下,“V1”,“V2”,等等将共享“数据”的NS

这将是这个样子:

let data = someArray;
let nameSpace = 'XXX';
let doc = "<?xml version='1.0' encoding='utf-8' ?><data xmlns='XXXX'></data>";
let parser = new DOMParser();
let xml = parser.parseFromString(doc, "text/xml");

for (let i = 0; i < data.length; i++) {
    let node = xml.createElementNS(nameSpace , "v" + (i + 1));
    $(node).text(data[i]);
    let elements = xml.getElementsByTagName("data");
    elements[0].appendChild(node);
 }

正确的结果会是什么样子:

<?xml version='1.0' encoding='utf-8' ?>
<data xmlns='XXXX'>
    <v1></v1>
    <v2></v2>
</data>

与坏的结果:

<?xml version='1.0' encoding='utf-8' ?>
<data xmlns='XXXX'>
    <v1 xmlns=""></v1>
    <v2 xmlns=""></v2>
</data>

有了这个解决方案,你也可以声明为您的孩子节点不同的命名空间。 只需更换nameSpace具有不同的命名空间URI字符串或另一组变量变量。



Answer 5:

名称空间是每个node.Removing命名空间的名称的固有部分是指需要再次重新创建节点。 下面是代码,在那里你可以没有命名空间属性创建子节点。

[xml]$oXmlDocume = [xml] (Get-Content  D:\myXml.xml)
// Assuming Project is the parent node
$project = $oXMLDocument.Project
$childNode = $oXMLDocument.CreateElement("Child",$project.NamespaceURI)
$0XMLDocument.AppendChild($ChildNode)

如果你需要你的孩子节点下创建subchild,然后按照相同的风格。



Answer 6:

名称空间是每个node.Removing命名空间的名称的固有部分是指需要再次重新创建节点。 下面是代码,在那里你可以没有命名空间属性创建子节点。

这意味着,如果你的主要标记包含命名空间属性和您的孩子不have.Hence,子节点将继承父默认的命名空间属性。 删除命名空间属性的最佳方式是

[xml]$oXMLDocument = (Get-Content "D:\myXml.xml")
# Assuming Project is the parent node with a namespace
$project = $oXMLDocument.Project
$childNode = $oXMLDocument.CreateElement("test",$project.NamespaceURI)
# (Optional) Add any attributes to the element
$childNode.SetAttribute("name", "value")
$oXMLDocument.DocumentElement.AppendChild($childNode)
# Save the document
$oXMLDocument.Save("D:\myXml2.xml")

基本上,这不会删除从孩子记的命名空间属性。 而事实上,你can't.This将隐藏属性作为默认

如果你需要你的孩子节点下创建subchild,然后按照相同的风格。



文章来源: Remove unwanted (empty) xmlns attribute added by appendChild