强制XML字符实体进入XmlDocument

时间:2010-09-08 05:41:40

标签: c# xml dom xmldocument

我有一些看起来像这样的XML:

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

我想强制XmlDocument使用括号的XML字符实体,即:

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

MSDN说:

  

为了分配属性值   包含实体引用,   user必须创建一个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进行字符串操作......

2 个答案:

答案 0 :(得分:3)

你大部分都不走运。

首先,您正在处理的内容称为字符引用,这就是CreateEntityReference失败的原因。存在字符引用的唯一原因是提供对在给定上下文中非法或者难以创建的字符的访问。

  

定义:字符引用   指的是一个特定的字符   ISO / IEC 10646字符集,用于   示例一不能直接访问   来自可用的输入设备。

See section 4.1 of the XML spec

当XML处理器遇到字符引用时,如果在属性值中引用它(即,如果在属性中使用&#xxx格式),则将其设置为“Included”,这意味着查找其值并替换文本。

  

字符串“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>

答案 1 :(得分:0)

你应该总是使用前面的@ like so @“My /?。,&lt;&gt; STRING”来操纵你的字符串。我不知道这是否会解决你的问题。 我会使用XmlDocument中的XmlNode类来解决这个问题。您可以使用Attributes属性,这样会更容易。看看这里: http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.attributes.aspx