2016-10-10 11 views
2

親XElementに追加すると、私のXAttributeの名前空間が予期せず変更されています。XElementに追加すると、System.Xml.Linq.XAttribute名前空間が予期せず変更される

私はこのようになりますいくつかのF#のコードがあります。それは変えていますいくつかの理由について

<MyRoot xmlns:odata="http://mynamespace"> 
    <MyXElement p3:myattrname="false" xmlns:p3="odata" /> 
</MyRoot> 

:私はmyRoot(myRoot.ToString())をプリントアウトしたときに

let myRoot = XElement(XName.Get("MyRoot")) 
let mychildxelement = XElement(XName.Get("MyXElement")) 
myRoot.Add(mychildxelement) 
myRoot.Add(XAttribute(XNamespace.Xmlns + "odata", "http://mynamespace")) 
let name = XNamespace.Get("odata") + myattrname 
mychildxelement.Add(XAttribute(name, "false")) 

残念ながら、それは次のXMLを生成しますネームスペースを "p3"に設定し、XElementのルートレベルに余分な名前空間ショートカットを追加します。私は本当に要素レベルのxmlnsを避けたい。誰もこれを避ける方法を知っていますか?

+3

[MCVE](http://stackoverflow.com/help/mcve) – CaringDev

答えて

5

XMLでは、それらを定義せずに任意の接頭辞を使用することはできません。親要素がない場合やドキュメントを含む場合、名前空間宣言が行える唯一の場所は要素そのものです。あなたはしかし、接頭辞をカスタマイズすることができます:

#r "System.Xml.Linq.dll" 

open System.Xml.Linq 

let myAttrName = "myattrname" 
let odata = "odata" 
let name = XNamespace.Get(odata) + myAttrName 
let myXElement = XElement(XName.Get("MyXElement")) 
myXElement.Add(XAttribute(XNamespace.Xmlns + odata, odata)) 
myXElement.Add(XAttribute(name, "false")) 

myXElement.ToString() 
// "<MyXElement xmlns:odata="odata" odata:myattrname="false" />" 

を更新

を使用すると、親要素を持っている場合は、次のように、子供の名前空間を指定する必要があります(つまり、名前空間ではなく、その接頭辞を使用します)SOによって(構文ハイライトを印刷

#r "System.Xml.Linq.dll" 

open System.Xml.Linq 

let odata = XNamespace.Xmlns + "odata" 
let odataNS = "http://mynamespace" 
let myRoot = XElement(XName.Get("MyRoot")) 
myRoot.Add(XAttribute(odata, odataNS)) 

let myChildXElement = XElement(XName.Get("MyXElement")) 
myChildXElement.Add(XAttribute(XNamespace.Get(odataNS) + "myAttrName", "false")) 
myRoot.Add(myChildXElement) 

printfn "%A" myRoot 

<MyRoot xmlns:odata="http://mynamespace"> 
    <MyXElement odata:myAttrName="false" /> 
</MyRoot> 
+0

を提供してくださいありがとう、これは何が起こっているのか理解するのに役立ちます。残念ながら、xmlnsを設定する親要素があり、私は同じ結果を得ています。私は何が欠けているのか考えていますか? (元の質問を更新してルート要素のコードを追加しました) – rysama

+1

@RodYan更新された回答を表示 – CaringDev

関連する問題