2010-09-08 54 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