2010-09-08 55 views
0

我有一些XML,看起來像這樣:部隊XML字符實體到XmlDocument的

<abc x="{"></abc> 

我想迫使XmlDocument的使用括號中的XML字符實體,即:

<abc x="&#123;"></abc> 

MSDN這樣說:

爲了分配一個包含實體引用的屬性值 , 用戶必須創建一個XmlAttribute節點 加上任何XMLTEXT和 XmlEntityReference節點,建立 適當的子樹,並使用 使用setAttributeNode將其指定爲一個屬性的 值。

CreateEntityReference聽起來前途,所以我想這:

XmlDocument doc = new XmlDocument(); 
doc.LoadXml("<abc />"); 
XmlAttribute x = doc.CreateAttribute("x"); 
x.AppendChild(doc.CreateEntityReference("#123")); 
doc.DocumentElement.Attributes.Append(x); 

而我得到的異常Cannot create an 'EntityReference' node with a name starting with '#'.

有什麼理由CreateEntityReference不喜歡 '#' - 更重要的是如何能我將字符實體放入XmlDocument的XML中?它甚至有可能嗎?我希望避免字符串操作的OuterXml ...

回答

3

你幾乎不走運。

首先,你正在處理的是字符引用,這就是爲什麼CreateEntityReference失敗。字符引用存在的唯一原因是提供在特定上下文中非法的或難以創建的字符。

定義:字符引用 指的是在 ISO/IEC 10646的字符集的特定的字符,用於從可用的輸入設備的示例 一個不能直接訪問 。

See section 4.1 of the XML spec

當XML處理器遇到一個字符引用,如果在一個屬性(即,如果&#xxx格式的屬性內部使用)的值引用,它被設置到「包含」,這意味着它的價值被擡起並且文本被替換。

字符串 「ATamp;T;」 擴展爲 「 AT&T;」,其餘符號是 未被識別爲一個實體引用 定界符

See section 4.4 of the XML spec

這被烤成XML規範和Microsoft XML棧正在做它需要做的事情:處理字符引用。

我能看到你做的最好的事情就是看看這些舊的XML.com文章,其中一篇使用XSL禁用輸出轉義,因此&amp;#123;將在輸出中變成&#123;
http://www.xml.com/pub/a/2001/03/14/trxml10.html

<!DOCTYPE stylesheet [ 
<!ENTITY ntilde 
"<xsl:text disable-output-escaping='yes'>&amp;ntilde;</xsl:text>"> 
]> 

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:output doctype-system="testOut.dtd"/> 

    <xsl:template match="test"> 
    <testOut> 
     The Spanish word for "Spain" is "Espa&ntilde;a". 
     <xsl:apply-templates/> 
    </testOut> 
    </xsl:template> 

</xsl:stylesheet> 

而這一次,它使用XSL轉換特定字符引用到其他文本序列(來完成同樣的目標,作爲以前的鏈接)。問題的
http://www.xml.com/lpt/a/1426

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       version="2.0"> 

    <xsl:output use-character-maps="cm1"/> 

    <xsl:character-map name="cm1"> 
    <xsl:output-character character="&#160;" string="&amp;nbsp;"/> 
    <xsl:output-character character="&#233;" string="&amp;233;"/> <!-- é --> 
    <xsl:output-character character="ô" string="&amp;#244;"/> 
    <xsl:output-character character="&#8212;" string="--"/> 
    </xsl:character-map> 

    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
+0

夢幻般的答案。我有一種感覺,我認爲「{」不會被內部表示爲{,所以XmlDocument不會「保留」該表示。 – TesterTurnedDeveloper 2010-09-08 06:45:17

0

你應該總是操縱你的字符串與前面的@像這樣@「我/?,<> STRING」。我不知道這是否能解決您的問題。 我會從XmlDocument使用XmlNode類來解決問題。你可以使用Attributes屬性,它會更容易。看看這裏: http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.attributes.aspx

+0

部分原因是將該屬性設置爲「{」將導致XML,看起來像「&#123;」。我試圖強制XmlDocument使用我想要的實體 - 但沒有太多的運氣。 – TesterTurnedDeveloper 2010-09-08 05:58:10