24

私はこのコードを持っています:

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

XMLドキュメントに新しいものを追加する必要があります。<Target name="BeforeBuild" />

xmlns=""しかし、それは私が望まない空の属性も追加します。(実際には、この属性が気に入らないのはVisual Studioです!)

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

私はすでにこのコードを試しました:

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

7 に答える 7

31

xmlns=""親要素が名前空間にあり、子要素がそうではないため、名前空間(非)宣言が追加されました。

この名前空間宣言を追加したくない場合は、子要素をその親と同じ名前空間に配置する必要があります。その答えは、要素の作成時にこの名前空間に配置することです。つまり、呼び出しCreateElement("Target", "")を変更して、正しい名前空間を指定します。

于 2012-11-05T09:21:20.300 に答える
15

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);
}
于 2016-02-15T10:58:33.763 に答える
13

考えられる解決策については、次を確認してください。

Powershellとcsproj

Xml名前空間とC#csproj

OPで機能した2番目のソリューションの回避策は次のとおりです。

$content = [xml] $content.OuterXml.Replace(" xmlns=`"`"", "")
$content.Save($_.FullName);
于 2012-11-04T15:50:12.887 に答える
1

Javascriptを使用する

JSを使用してXMLドキュメントを作成しxmlns="XXXX"ていて、親ノードで宣言した後に子ノードで空白のxmlns属性を取得している場合は、のcreateElementNS(namespace, nodeName)代わりにJSを使用して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文字列または別のセット変数に置き換えるだけです。

于 2017-12-19T19:45:38.380 に答える
1

名前空間は、各ノードの名前の固有の部分です。名前空間を削除すると、ノードを再作成する必要があります。これが、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")

基本的に、これは子ノートから名前空間属性を削除しません。そして実際にはできません。これにより、デフォルトとして属性が非表示になります。

子ノードの下にサブ子を作成する必要がある場合は、同じスタイルに従います。

于 2018-05-03T18:13:17.080 に答える
0

名前空間は、各ノードの名前の固有の部分です。名前空間を削除すると、ノードを再作成する必要があります。これが、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)

子ノードの下にサブ子を作成する必要がある場合は、同じスタイルに従います。

于 2018-05-03T17:11:18.840 に答える
0

VBAでWebサイトマップを作成するときにこの問題が発生していましたが、@Neoliskによって正しい方向に進みました。これで私の問題は解決しました:

'replace the empty attribute with nothing and load it back into the XML source
myTree.LoadXML Replace(myTree.XML, " xmlns=""""", "")

'Write that XML to a file
myTree.Save xmlFileName

助けてくれてありがとう、@ Neolisk!

于 2022-02-18T12:38:21.100 に答える