2012-10-12 78 views
0

我知道關於http://msdn.microsoft.com/en-us/library/bb387069.aspx。我已閱讀示例文章。但在F#中,String向XName轉換有一些麻煩。一些代碼,我嘗試使用:如何向XElement添加名稱空間前綴

let (!!) : string -> XName = XName.op_Implicit 


> XElement(!!"tmp:" + !!"root", !!"Content");; 
stdin(9,21): error FS0001: The type 'XName' does not support any operators named '+' 

> XElement(!!("tmp:" + "root"), !!"Content");; 
System.Xml.XmlException: The ':' character, hexadecimal value 0x3A, cannot be included in a name. 

> XElement("tmp" + "root", "Content");; 
The type 'string' is not compatible with the type 'XName' 

我想要什麼:

<tmp:root>Content</tmp:root> 

UPD: 我只想前綴命名空間標記之前,這樣的:

<tmp:root>Content</tmp:root> 

無類似的東西:

> let ns = XNamespace.Get "http://tmp.com/";; 

val ns : XNamespace = http://tmp.com/ 

> let xe = XElement(ns + "root", "Content");; 

val xe : XElement = <root xmlns="http://tmp.com/">Content</root> 

回答

0

您需要添加一個名稱空間才能使其工作。 嘗試是這樣的:

#r "System.Xml.Linq.dll";; 
open System.Xml.Linq 

let ns = "tmp" |> XNamespace.Get 
let (!!) : string -> XName = XName.op_Implicit 

let rt = !!("blank") 

let urlset = new XElement(rt, 
          new XAttribute(XNamespace.Xmlns + "tmp",ns), 
          new XElement(ns + "root","Content")) 

輸出:

val urlset : XElement = 
<blank xmlns:tmp="tmp"> 
    <tmp:root>Content</tmp:root> 
</blank> 
+0

好吧,「讓urlset = new XElement(ns +」blank「,」...因爲我不需要一個空白節點) – psct

1

我會做什麼是定義一個額外的功能,每個命名空間:

let (!!) = XName.op_Implicit 

let tmp = 
    let ns = XNamespace.op_Implicit "www.temp.com" 
    fun n -> XNamespace.op_Addition (ns, n) 

XElement (tmp "root", "Content") 

或者,你可以創建一個函數,它的護理:在名稱:

let xn (name : String) = 
    match name.IndexOf ':' with 
    | -1 -> XName.op_Implicit name 
    | i -> XNamespace.op_Addition (XNamespace.Get (name.Substring (0, i)), name.Substring (i + 1)) 

XElement (xn "tmp:test", "Content") 
+0

這產生了一些像 「<ДокументВерсия=」 0.1" 的xmlns = 「www.TVZ.com」/>」。我想要「 psct

2

'我通常做的是...

let xmlns = XNamespace.Get 

let ns = xmlns "http://my.namespace/" 

XElement(ns + "root", "Content") 

我也傾向於不擔心形式的兩種不同方式之間的區別注意字符串輸出中的命名空間。這對XML解析器來說意味着同樣的事情。

+0

>兩種不同格式化命名空間的不同之處[前綴ns和單獨的ns?我只需要前綴,它不僅僅是我使用的xml格式 – psct

+1

在您只能使用前綴創建子節點之前,必須在父節點上存在帶有URL和前綴定義的xmlns屬性。 [這個問題描述瞭如何使用LINQ to XML來實現這個功能](http://stackoverflow.com/questions/1748003/linq-to-xml-and-namespace-prefixes)。 –

+0

@JoelMueller:鑑於他特意要求提供前綴,您可能需要更新您的答案以包含該鏈接。 – Guvante

相關問題