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

2024-01-28

我有一些如下所示的 XML:

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

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

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

MSDN 是这样说的:

为了分配属性值 包含实体引用, 用户必须创建一个 XmlAttribute 节点 加上任何 XmlText 和 XmlEntityReference 节点,构建 适当的子树和使用 SetAttributeNode 将其指定为 属性的值。

创建实体引用 http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.createentityreference.aspx听起来很有希望,所以我尝试了这个:

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 的字符串操作...


你大多不走运。

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

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

(请参阅 XML 规范第 4.1 节 http://www.w3.org/TR/REC-xml/#sec-references)

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

字符串“AT&amp;T;“扩展为”AT&T;" 剩下的 & 符号是 不被识别为实体引用 分隔符

(请参阅 XML 规范第 4.4 节 http://www.w3.org/TR/REC-xml/#entproc)

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

我能看到您做的最好的事情就是看一下这些旧的 XML.com 文章,其中一篇使用 XSL 来禁用输出转义,以便&amp;#123;会变成&#123;在输出中。
http://www.xml.com/pub/a/2001/03/14/trxml10.html 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 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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

强制将 XML 字符实体放入 XmlDocument 中 的相关文章

  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new

随机推荐

  • 按下 tkinter 按钮时如何播放声音?

    我正在为 Windows PC 构建一个程序 其中包含很多按钮并且看起来非常简单 所以我想知道 当你按下按钮 使用 tkinter 时 我可以播放声音来让程序活跃一点吗 请记住我正在学习 所以请简单一点 假设您的文件是 WAV from t
  • 实体类型没有定义键

    另一个 实体类型 x 没有定义键 问题 但我已经设置了 Key 属性上的属性所以我有点困惑 这是我的实体和上下文类 namespace DoctorDB Models public class Doctor Key public strin
  • gzip 无法在 Django 中使用 Whitenoise 工作

    我在 Heroku 上部署了一个 Django 网站 使用 Whitenoise 提供静态文件 静态文件工作正常 但根据我用来测试它的各种网站 包括谷歌工具 Gzip 无法工作 这是我的生产设置文件中的代码 DATABASES defaul
  • iPhone:通过蓝牙序列化和发送对象?

    序列化对象并通过蓝牙 或网络连接 发送它的最佳方法是什么 你可以使用gamekit http developer apple com library ios documentation NetworkingInternet Conceptu
  • 绘制从远程服务器下载的图像

    我需要执行以下操作 从服务器下载 PNG 资源 根据状态在该图像上绘制几个具有不同颜色的矩形 在可缩放图像视图中显示该图像 我在使用 Canvas 的 Android 应用程序中有一个工作代码 但我不知道如何使用 Flutter 来做到这一
  • Java中如何让程序等待按钮按下

    现在 我不确定这是否可能 甚至是完成我想要做的事情的最佳方法 但基本上我正在使用一个非常简单的 Swing GUI 创建一个非常简单的模拟程序 每轮模拟结束后 界面上的一些按钮都会启用 供用户进行更改 然后用户可以按 继续 按钮再次开始模拟
  • JPA 继承 - 更改实体类型

    我有两节课 Entity Inheritance strategy InheritanceType SINGLE TABLE DiscriminatorColumn name PERSONTYPE DiscriminatorValue va
  • 草皮遮罩返回没有洞的多边形

    我得到一些奇怪的结果草皮 mask https turfjs org docs mask 这是polygon我正在尝试运行mask 功能 https gist githubusercontent com Stophface 50155878
  • 在参数中运行带引号的命令适用于commands.getoutput(),但不适用于子进程模块

    我正在创建一个 python 程序 它调用许多其他程序和脚本 在 Unix SUNos Linux 上 除了 1 个脚本之外 我在所有地方都使用子进程 我不使用子进程的脚本是一个 perl 脚本 它已被制作成可执行文件 不知何故 它不允许我
  • 4 次矩阵乘法的 np.einsum 性能

    给定以下 3 个矩阵 M np arange 35 37 59 reshape 35 37 59 A np arange 35 51 59 reshape 35 51 59 B np arange 37 51 51 59 reshape 3
  • SqlDataReader 参数不起作用

    我有一个 Windows 窗体 要求用户在 textbox1 中输入 pcname 然后尝试使用SqlDataReader从数据库中读取以获取电脑IP地址 然后将电脑驱动器映射到我的本地电脑 但由于某种原因 当我在 SQL 参数中使用文本框
  • 不要将 --build-id 从 gcc 传递给链接器

    我正在尝试使用以下命令编译嵌入式手臂处理器gcc arm linux gnueabi and nostdlib删除对 c 库和启动文件的依赖关系 该芯片没有任何解释 elf 文件的方法 因此使用objcopy O binary 我可以从中删
  • OpenGL 纹理上传:UNSIGNED_BYTE 与 UNSIGNED_INT_8_8_8_8

    我正在调用 glTexSubImage2D 如果我的像素格式是GL RGBA 然后是像素类型GL UNSIGNED BYTE and GL UNSIGNED INT 8 8 8 8完全等价 另外 这两对等价吗 Format GL RGBA
  • GATT 配置文件和 UART 服务

    我是开发通过蓝牙连接到外围设备的移动应用程序的新手 我搜索到 GATT 是用于蓝牙LE 通信的相关配置文件 但我们的客户建议我们使用 UART 服务 现在我很困惑 1 这两件事是如何关联的 2 我们是否必须选择其中之一 如果是的话 每一个的
  • Excel 条件动态数据验证

    我在使用 Excel 时遇到一个小问题 这是问题定义 我想要下表的条件数据验证 Column 1 Column 2 Y Res1 Y Res2 N Res3 N Res4 Y Res5 从上表中 我需要一个单元格下拉列表 使用数据验证 其中
  • 使用 dplyr 的 mutate 函数返回分组数据框中的相对值

    我正在尝试使用 dplyr 的 mutate 函数创建一个新变量 该变量根据 ifelse 语句的值提取现有变量的相对值 这是我想要实现的目标的一个示例 希望能更好地说明问题 id from date fobs to date a 1999
  • Pandas:如何将多个单元格与列表/元组进行比较

    我需要将数据框中的某些列作为一个整体进行比较 例如 df pd DataFrame A 1 1 3 B 4 5 6 Select condition If df A 1 and df B 4 then pick up this row 对于
  • 如何判断 Froyo 中何时发生配置更改?

    在我的应用程序中 我希望播放一个媒体文件 并且在用户旋转屏幕 破坏 Activity 时继续播放 但如果用户移动到不同的 Activity 或另一个 Activity 出现在该 Activity 上 我希望它停止播放 他们按下后退按钮 无论
  • 如何使一种形式保持在另一种形式之上?

    我已经找到了Form TopMost属性 但它将表单置于所有内容之上 包括不属于我的应用程序的内容 我怀疑我在这里遗漏了一些明显的东西 是Form非模式对话框的正确基类 使用对话框窗体的 Form Owner 属性并将其设置为主窗体 在这里
  • 强制将 XML 字符实体放入 XmlDocument 中

    我有一些如下所示的 XML