添加到XElement时,会意外修改System.Xml.Linq.XAttribute命名空间

时间:2016-10-10 21:49:13

标签: .net xml linq f#

添加到父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。有谁知道如何避免这种情况?

1 个答案:

答案 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>