2016-03-31 3 views
1

を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の直下の子ノードが空の名前空間で表示されないようにする方法はありますか?

答えて

3

声明:

解析は現在の名前空間コンテキストで実行されます。

は、XML文字列に含まれる可能性のある名前空間接頭辞は、文書が定義する名前空間接頭辞のコンテキストで解釈されることを意味します。

これは、以下のものが動作することを発生します

<data xmlns:foo="http://www.example.com" xmlns="http://test"> 
    <new> 
     <foo:person> 
     <foo:name>Joe</foo:name> 
     </foo:person> 
    </new> 
</data> 

Const ns As String = "http://test" Const ns_foo As String = "http://www.example.com" Dim doc As XmlDocument = New XmlDocument() doc.LoadXml(String.Format("<data xmlns=""{0}"" xmlns:foo=""{1}""></data>", ns, ns_foo)) Dim newElement As XmlElement = doc.CreateElement("new", ns) doc.DocumentElement.AppendChild(newElement) newElement.InnerXml = "<foo:person><foo:name>Joe</foo:name></foo:person>" 

と結果しかし、接頭辞を持っていないノードは、定義により、不特定の名前空間にあります。それらはデフォルトネームスペースにあります。

InnerXmlを設定すると、デフォルトの名前空間に影響を与えることはできません。デフォルトの名前空間は空の名前空間であると常に仮定されます。

+1

これは私の要点です。接頭辞を持たないノードは特別な名前空間にはなく、デフォルトの名前空間に入ります。だからなぜ私のinnerxml ジョーは、<人xmlns = "">ジョーになるでしょうか? xmlns = ""を省略し、ルートノードによって提供されるxmlnsを仮定してはいけませんか? – HashTagDevDude

+1

はい、しかし、デフォルトの名前空間は「対象の文書が持つもの」ではなく、「文字列をノードに解析するときに合理的に想定できるもの」です。また、新しいノードが親ノードに適用されるのと同じデフォルトの名前空間を取得する必要があると仮定することは合理的ではありません。これは、ユースケースの「残りの半分」では間違っているためですが、 "namespace-less"ノードをドキュメントに追加します。 – Tomalak

+0

@HashTagDevDude **解決策:**インポートするXMLに明示的なデフォルト名前空間を使用してください。 ( '" Joe ")。そうすれば、要素の名前空間についてあいまいさはありません。彼らは文字列に自分自身を表すことができ、その名前空間は明確であり、別の文書にインポートすることができ、その名前空間は*まだ*クリアです。 – Tomalak

関連する問題