2013-07-02 24 views
1

我使用XMLDocument創建XML文件,但是當XML節點獲得'&'作爲數據時,它將轉換爲「Ampersand(&)amp;」但我需要'&'的實際價值,任何人都可以告訴我我該如何實現它?如何解決XML中的&符號(&)轉換問題?

結果:

+2

可能重複http://stackoverflow.com/questions/1328538/how-do-i- escape-ampersands-in-xml) –

+0

@ AndersR.Bystrup:我不認爲這就是他要問的。他在問他如何避免逃避和號。 –

回答

6

&是在XML文檔中非法(CDATA節之外;見@ RSP的答案),所以這是不可能的。如果節點數據中有逐字符號,則其編碼爲&

但它也沒有問題,因爲任何XML閱讀器在解析XML文件時都會將&解碼爲文字&

2

如果真的有必要在XML表示中使用非轉義&符號,則可以使用CDATA部分,代碼字符數據以<![CDATA[開頭和]]>結尾。

2

我曾經有過這種情況,我想保留XML中的原始&符號。雖然你的解析器可能不是我的一樣(我用MarkLogic),下面仍適用於您的情況有任何XML解析器:

與符號字符

The ampersand character can be tricky to construct in an XQuery string, as it is an escape character to the XQuery parser. The ways to construct the ampersand character in XQuery are: 

    Use the XML entity syntax (for example, &amp;). 
    Use a CDATA element (<![CDATA[element content here]]>), which tells the XQuery parser to read the content as character data. 
    Use the repair option on xdmp:document-load, xdmp:document-get, or xdmp:unquote. 
    https://help.marklogic.com/knowledgebase/article/View/55/0/xquery-ampersand-in-string 

很明顯的問題,第一個選項上市上面,這是爲了逃避&符號,不是我們想要去的方向。我們想要原始的&符號,而不是逃脫的實體。
第二種選擇似乎首先是一個好主意,而且我在CDATA元素上玩了很長時間。 CDATA允許「字符數據」,而裏面的所有內容都被視爲字符數據,而不是真正的XML。在演示了一些例子之後,我發現你可能會使CDATA返回並號,但是CDATA元素非常不友好。例如,創建動態CDATA元素幾乎是不可能的,你不能簡單地將XML結構包裝在CDATA中。 CDATA意味着它內部有靜態的,預定義的字符。如果有一種使用CDATA的有效方式,我無法找到它。 Xdmp:quote和xdmp:unquote做我們需要的技巧,儘管不是我們期望的那樣。例如:

let $xml := <rootNode title="test"><firstLevel type="crazy"><secondLevel reason="testing">D&amp;C</secondLevel><secondLevel owner="clint">D&amp;C</secondLevel></firstLevel></rootNode> 
return xdmp:quote($xml//secondLevel[1]) 
(: Returns <secondLevel reason="testing">D&amp;C</secondLevel> :) 

let $xml := <rootNode title="test"><firstLevel type="crazy"><secondLevel reason="testing">D&amp;C</secondLevel><secondLevel owner="clint">D&amp;C</secondLevel></firstLevel></rootNode> 
return xdmp:quote($xml//secondLevel[1]/node()) 
(: Returns D&C - an unescaped ampersand! :) 

第二個例子給我們的轉義符號,但這僅僅是因爲我們正試圖xdmp對象:報價是文本,而不是一個元素。在第一個示例中,如果我們嘗試引用元素,它將返回XML文本版本,但帶有D - & C - 轉義符號。因此,爲了讓xdmp:quote給我們一個帶&符號的字符串,帶&符號的對象必須是獨立文本。
從這裏,可能會有幾個不同的方向,我的想法肯定不是最優雅或有效的。但是我決定做一個遞歸函數,將所有的XML解析爲文本,並且允許純文本的xdmp:quote用於和號。

declare function local:stringify($xml) 
{ 
    if (xdmp:node-kind($xml) eq "text") then 
    xdmp:quote($xml, <options xmlns="xdmp:quote"> 
        <method>text</method> 
       </options>) 
    else if (xdmp:node-kind($xml) eq "element") then 
     fn:string-join(
     (fn:concat("<", fn:local-name($xml)), 
     for $attr in $xml/@* 
      return fn:concat(' ', fn:local-name($attr), '="', $attr, '"'), 
     ">", 
     for $node in $xml/node() 
      return local:stringify($node), 
     fn:concat("</", fn:local-name($xml), ">") 
    ), "") 
    else() 
}; 

let $xml := <rootNode title="test"><firstLevel type="crazy"><secondLevel reason="testing">D&amp;C</secondLevel><secondLevel owner="clint">D&amp;C</secondLevel></firstLevel></rootNode> 


return local:stringify($xml) 
(: Returns <rootNode title="test"><firstLevel type="crazy"><secondLevel reason="testing">D&C</secondLevel><secondLevel owner="clint">D&C</secondLevel></firstLevel></rootNode> :) 

所以,儘管這個方案不允許與號在在我們的應用程序通過周圍存在XML,它允許文本其傳遞正在被處理該包裹的XML。

1

我想可以使用下面的行。 選項像"repair-full"&&只有

let $InputXML := xdmp:unquote($inputSearchDetails, "", ("format-xml", "repair-full"))

的[我如何逃脫XML&符號?(
相關問題