添加到父XElement时,我的XAttribute的命名空间被意外修改。
我有一些看起来像这样的F#代码:
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"))
不幸的是,当我打印出myRoot(myRoot.ToString()
)时,会生成以下xml:
<MyRoot xmlns:odata="http://mynamespace">
<MyXElement p3:myattrname="false" xmlns:p3="odata" />
</MyRoot>
由于某种原因,它将命名空间更改为“p3”并在XElement的根级别添加额外的命名空间快捷方式。我真的想避免使用Element级别的xmlns。有谁知道如何避免这种情况?
答案 0 :(得分: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" />"
<强>更新强>
如果您有父元素,则需要按如下方式指定子元素的名称空间(即使用命名空间而不是其前缀):
#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
打印(通过SO突出显示语法)
<MyRoot xmlns:odata="http://mynamespace">
<MyXElement odata:myAttrName="false" />
</MyRoot>