をInnerXmlプロパティを設定した後、私はこれと同様の問題に出くわした:私は、新しいノードを作成し、その後の文字列にはInnerXmlプロパティ、プロパティの設定をしてい除き空白のxmlns =「」新しいのXmlElementに
How to prevent blank xmlns attributes in output from .NET's XmlDocument?
XML。私が期待したもの
Dim ns As String = "http://test"
Dim doc As XmlDocument = New XmlDocument
doc.LoadXml(String.Format("<data xmlns=""{0}""></data>", ns))
Dim newElement As XmlElement = doc.CreateElement("new", ns)
newElement.InnerXml = "<person><name>Joe</name></person>"
Dim result As String = newElement.OuterXml
です:
それは実際に作成何<data xmlns="http://test">
<new>
<person>
<name>Joe</name>
</person>
</new>
</data>
:
<data xmlns="http://test">
<new>
<person xmlns="">
<name>Joe</name>
</person>
</new>
</data>
MSDNによると、解析は現在の名前空間コンテキストで実行されます。私は、現在の名前空間コンテキストがnewElementだけでなく、インポートされたすべての子ノードのデフォルトの名前空間であると考えました。 CreateDocumentFragment()を使用して同じ問題が発生しました。
xmlの文字列をインポートするときにnewElementの直下の子ノードが空の名前空間で表示されないようにする方法はありますか?
これは私の要点です。接頭辞を持たないノードは特別な名前空間にはなく、デフォルトの名前空間に入ります。だからなぜ私のinnerxmlジョー は、<人xmlns = "">ジョー になるでしょうか? xmlns = ""を省略し、ルートノードによって提供されるxmlnsを仮定してはいけませんか? –
HashTagDevDude
はい、しかし、デフォルトの名前空間は「対象の文書が持つもの」ではなく、「文字列をノードに解析するときに合理的に想定できるもの」です。また、新しいノードが親ノードに適用されるのと同じデフォルトの名前空間を取得する必要があると仮定することは合理的ではありません。これは、ユースケースの「残りの半分」では間違っているためですが、 "namespace-less"ノードをドキュメントに追加します。 – Tomalak
@HashTagDevDude **解決策:**インポートするXMLに明示的なデフォルト名前空間を使用してください。 ( '" Joe ")。そうすれば、要素の名前空間についてあいまいさはありません。彼らは文字列に自分自身を表すことができ、その名前空間は明確であり、別の文書にインポートすることができ、その名前空間は*まだ*クリアです。 –
Tomalak