2012-02-12 4 views
0

属性を持つ要素を追加するために次のコードを実行すると、最後にxlmns = ""が追加されます。私はそれが親のものかそれに類するものの名​​前空間を設定する必要があることを読んだ。奇妙なことに、ファイル内で親アイテムに既に名前空間が設定されているため、ドキュメントがロードされたときになぜそれがまだ考慮されていないのか分かりません。しかしどちらの方法でも、名前空間がそこにあることを伝える方法を知りたいので、xlmns = "をすべての終わりに追加するのを止めます。xmlns = ""をプロジェクトネームスペースを設定して取り除く方法

XmlDocument xDoc = new XmlDocument(); 
xDoc.Load(projectFile); 

// ... 
// ... 

var n = xDoc.CreateNode(XmlNodeType.Element, "Compile", null); 
var a = xDoc.CreateAttribute("Include"); 
a.Value = filePath; 
n.Attributes.Append(a); 
itemGroupNode.AppendChild(n); 
xDoc.Save(@"c:\projects\BusinessObjects\BusinessObjects.csproj"); 
+0

あなたは[XMLにLINQ]を使用していない何らかの理由(のhttp:/ /msdn.microsoft.com/en-us/library/bb387098.aspx)? – dtb

+0

@dtb私はxmlをあまり扱っていません(少なくとも、自分自身でxmlを混乱させる必要はありません)。これは私がすばやく行う必要がある非常に小さなツールですので、私はそれを行う方法を見つけることができる最速の方法をやっているだけです。私は自分自身がそれ以上のXMLをやる必要があると分かったら、私はそれを使用すると確信しています。 –

+1

古いXmlDocument/XmlElementクラスは、LINQ to XMLのXDocument/XElementクラスと比較して動作する痛みです。それを試してみてください! :-) – dtb

答えて

3

あなたが名前空間"http://schemas.microsoft.com/developer/msbuild/2003"で要素に名前空間""を持つ要素を追加しています。つまり、新しい要素にはxmlns属性が必要です。名前空間"http://schemas.microsoft.com/developer/msbuild/2003"に要素を追加する場合、xmlns属性は必要ありません

(これは親要素から継承しているため):

var n = xDoc.CreateNode(XmlNodeType.Element, "Compile", 
      "http://schemas.microsoft.com/developer/msbuild/2003"); 
+0

クールで、うまくいきました。しかし、その情報のために親ノードを探すように指示する方法はありませんか? –

+1

* itemGroupNode *が[XmlElement](http://msdn.microsoft.com/en-us/library/system.xml.xmlelement.aspx)であると仮定すると、* itemGroupNode。[NamespaceURI](http:// msdn.microsoft.com/en-us/library/system.xml.xmlelement.namespaceuri.aspx)*ハードコードする代わりに名前空間を取得します。 – dtb

+0

完璧、ありがとう! –

関連する問題