3

既存の xml ドキュメントがあります。

例えば

<Test>
  <A />
</Test>

この xml を XDocument に読み込みます。このドキュメントに属性 xmlns を追加し、この属性で保存する必要があります。

var xml = new XDocument.Load("c:\\filePath.xml");

私がこれを試しているとき:

xml.Root.SetAttributeValue("xmlns", "http://namespaceuri");

私は例外を取得しています:

System.Xml.XmlException: The prefix '' cannot be redefined from 'http://namespaceuri' to  within the same start element tag.

ありがとう

4

1 に答える 1

7

名前も名前空間に含まれるように設定する必要があります。

XNamespace ns = "http://namespaceuri";
foreach (var element in xml.Descendants().ToList())
{
    element.Name = ns + element.Name.LocalName;
}
xml.Root.SetAttributeValue("xmlns", ns.ToString());

基本的に、すべての要素をその名前空間に移動し、それをルート要素のデフォルトの名前空間にしようとしています。要素自体を異なるが修飾されていない名前空間に残したまま、デフォルトの名前空間を変更することはできません。

Aサンプル XML ( close に修正)で上記のコードを使用すると、次のようになります。

<Test xmlns="http://namespaceuri">
  <A />
</Test>

このコードは、すべての要素の名前空間を変更することに注意してください。より選択的にしたい場合は、Where呼び出しの後にxml.Descendants()呼び出しを追加する必要があります。

foreach (var element in xml.Descendants()
                           .Where(x => x.Name.Namespace == XNamespace.None)
                           .ToList())
于 2013-07-18T18:08:10.613 に答える