私はこのコードを持っています:
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");
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);
}
親要素は名前空間にあり、子要素はそうでないため、xmlns = ""名前空間(非)宣言が追加されました。この名前空間宣言を追加したくない場合は、子要素をその親と同じ名前空間に含める必要があることを意味し、答えは、要素の作成時にこの名前空間に配置することです。つまり、CreateElement( "Target"、 "")の呼び出しを変更して、正しい名前空間を指定します。
これらの可能な解決策を確認してください:
OPで機能した2番目のソリューションの回避策を次に示します。
$content = [xml] $content.OuterXml.Replace(" xmlns=`"`"", "")
$content.Save($_.FullName);
JavaScriptを使用
JSを使用してXMLドキュメントを作成し、親ノードで_xmlns="XXXX"
_を宣言した後に子ノードで空白のxmlns属性を取得する場合は、createElementNS(namespace, nodeName)
ではなくJS createElement(nodeName)
を使用します。
これは、子ノードが親と同じ名前空間を共有することを前提としています。以下の場合、 'v1'、 'v2'などは、NS of 'データ '
次のようになります。
_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文字列または別のセット変数に置き換えるだけです。
名前空間は各ノードの名前に固有の部分です。名前空間を削除すると、ノードを再作成する必要があります。以下は、Namespaceプロパティなしで子ノードを作成できるコードです。
つまり、メインタグに名前空間属性が含まれ、子には名前空間属性がない場合、子ノードはデフォルトの名前空間属性を親から継承します。名前空間属性を削除する最良の方法は
[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")
基本的に、これは子ノートから名前空間属性を削除しません。そして実際にはできません。これにより、デフォルトとして属性が非表示になります
子ノードの下に子を作成する必要がある場合は、同じスタイルに従います。
名前空間は各ノードの名前に固有の部分です。名前空間を削除すると、ノードを再作成する必要があります。以下は、Namespaceプロパティなしで子ノードを作成できるコードです。
[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)
子ノードの下に子を作成する必要がある場合は、同じスタイルに従います。