强制将 XML 字符实体放入 XmlDocument 中

Tes*_*per 2 c# xml xmldocument dom

我有一些如下所示的 XML:

<abc x="{"></abc>
Run Code Online (Sandbox Code Playgroud)

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

<abc x="&#123;"></abc>
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

我得到了例外Cannot create an 'EntityReference' node with a name starting with '#'.

CreateEntityReference 不喜欢“#”的任何原因 - 更重要的是如何将字符实体获取到 XmlDocument 的 XML 中?有可能吗?我希望避免 OuterXml 的字符串操作......

Ada*_*lls 5

你大多不走运。

\n

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

\n
\n

定义:字符引用是指 ISO/IEC 10646 字符集中的特定字符,例如无法从可用输入设备直接访问的字符。

\n
\n

参见 XML 规范第 4.1 节

\n

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

\n
\n

字符串“ AT&amp;T;”扩展为“\n AT&T;”,剩余的 & 符号\n不被识别为实体引用\n分隔符

\n
\n

参见 XML 规范第 4.4 节

\n

这已纳入 XML 规范中,并且 Microsoft XML 堆栈正在执行其需要执行的操作:处理字符引用。

\n

我能看到您所做的最好的事情就是看一下这些旧的 XML.com 文章,其中一篇使用 XSL 来禁用输出转义,以便在输出中&amp;#123;转义。\n http://www.xml.com/pub/a/2001/03/14/trxml10.html&#123;

\n
<!DOCTYPE stylesheet [\n<!ENTITY ntilde \n"<xsl:text disable-output-escaping=\'yes\'>&amp;ntilde;</xsl:text>">\n]>\n\n<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"\n     version="1.0">\n\n  <xsl:output doctype-system="testOut.dtd"/>\n\n  <xsl:template match="test">\n    <testOut>\n      The Spanish word for "Spain" is "Espa&ntilde;a".\n      <xsl:apply-templates/>\n    </testOut>\n  </xsl:template>\n\n</xsl:stylesheet>\n
Run Code Online (Sandbox Code Playgroud)\n

这个使用 XSL 将特定字符引用转换为其他文本序列(以实现与上一个链接相同的目标)。
\n http://www.xml.com/lpt/a/1426

\n
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"\n                version="2.0">\n\n  <xsl:output use-character-maps="cm1"/>\n\n  <xsl:character-map name="cm1">\n    <xsl:output-character character="&#160;" string="&amp;nbsp;"/>   \n    <xsl:output-character character="&#233;" string="&amp;233;"/> <!-- \xc3\xa9 -->\n    <xsl:output-character character="\xc3\xb4" string="&amp;#244;"/>\n    <xsl:output-character character="&#8212;" string="--"/>\n  </xsl:character-map>\n\n  <xsl:template match="@*|node()">\n    <xsl:copy>\n      <xsl:apply-templates select="@*|node()"/>\n    </xsl:copy>\n  </xsl:template>\n\n</xsl:stylesheet>\n
Run Code Online (Sandbox Code Playgroud)\n