【问题标题】:System.Xml.Linq.XAttribute namespace is modified unexpectedly when added to XElementSystem.Xml.Linq.XAttribute 命名空间在添加到 XElement 时被意外修改
【发布时间】:2016-10-10 21:49:13
【问题描述】:

我的 XAttribute 的命名空间在添加到父 XElement 时被意外修改。

我有一些 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。有谁知道如何避免这种情况?

【问题讨论】:

标签: .net xml linq f#


【解决方案1】:

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>

【讨论】:

  • 谢谢,这有助于我了解发生了什么。不幸的是,有一个父元素设置了 xmlns,我仍然得到相同的结果。你知道我错过了什么吗? (我已经更新了原始问题以包含带有根元素的代码)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多