1

私は VB 2008 を使用しており、XDocument のルート要素に xmlns="mynamespace" 属性を追加しようとしています。

XML ドキュメントはサード パーティによって作成され、VB XDocument オブジェクトに読み込まれました。当然、名前空間はありません。私はローカル コピーに取り組んでおり、MSDNの Beth Massi vids の指示に従って、VB で XMLToSchema を使用してインテリセンスなどを有効にできるように、テキスト エディターで名前空間に追加しました。コードの残りの部分が機能するようになったので、ライブ ドキュメントをもう一度開きたいと思います。名前空間がないと、XML リテラルが解決されません。

いくつかの方法を使用して XMLNS プロパティをルート タグに追加しようとしましたが、失敗しました。最も近いのは次の 3 つのコード サンプルでした。

Dim myNS As XNamespace = "urn:nbf:namespacename"
myXML.Element("nameofrootelement").Add(myNS)

^^^^ 名前空間は、属性としてではなく、ルート要素の値として追加されました。

XML.Root.Add(New XAttribute("xmlns", "name"))

^^^^ エラーが生成されました: 実行時例外がスローされました: System.Xml.XmlException - 同じ開始要素タグ内でプレフィックス '' を '' から 'name' に再定義することはできません。

しかし

XML.Root.Add(New XAttribute("test", "name"))

^^^^ 正常に動作します。おそらく、予約済みの属性を手動で設定しようとするのは好きではありませんか? この名前空間は、私が行ったいくつかのグーグルからは複雑すぎるようです。

この問題を回避するにはどうすればよいですか? :D

ありがとう!


アップデート

ありがとうアンソニー。

名前空間について理解を深める必要があると思います。

と思いました。ToStringそれを変更し、次に . Parseそれもそうですが、もう少し理解を深めるのに役立つように、より良い解決策が必要でした! 私はこれを試しましたが、あなたが正しく指摘したように、それはすべての子孫にも影響するため、まだ壊れています。

さまざまなサード パーティによって作成された複数の XML フィードを使用しますが、簡単にするために、名前空間を完全に省略します。

私自身のカスタム解析関数は、サード パーティのフィードを 1 つの統一されたドキュメントに書き換え、それを別のルーチンで処理します。XML の中間部分に ns を追加できるので、2 次関数をコーディングするときに役立ちます。

ありがとう!

4

1 に答える 1

2

すべてのタグの真の完全な名前は、XML で見られるタグ名 (ローカル名と呼ばれる) と名前空間であることを理解する必要があります。要素に xmlns="xxx" を配置しようとすると、その要素と、独自の名前空間が明示的に割り当てられていないそのすべての子孫の名前を効果的にまとめようとしています。

タグ名が要素で読み取り専用であるように、その要素の名前空間は読み取り専用です。

おそらく最も簡単な解決策は (最初にサードパーティに XML を適切に生成させることができないと仮定して)、解析する前にテキストに xmlns を挿入することです。

于 2009-01-20T13:29:49.563 に答える