为什么 XmlDocument 在 .NET 4 中不是动态的?

2024-01-30

我希望看到使用的领域之一dynamic是XML。我认为这将使 XML 处理代码编写起来更简单,并且我相信在 C# 4 出现之前我看到了一些示例,并且提到了它在这个答案中 https://stackoverflow.com/questions/2255982/c-4-real-world-example-of-dynamic-types/2256051#2256051作为此功能的用途之一。

所以,我的问题是:为什么不XmlDocument (or XDocument) 变得动态,或者为什么 C# 4 中没有一些用于动态 XML 操作的新类?

这对我来说更奇怪,当我在 PowerShell 中考虑时,XmlDocument 是动态的,代码如下$xmlDoc.root.subnode.subsubnode在那里工作。


我对大量看似权威的讨论却没有答案感到惊讶。你的问题太棒了。它准确地解决了那些令人敬畏的事情dynamic关键字的目的是。问题是,没有多少人真正知道如何充分利用它。

虽然 MS 没有为我们构建动态 XML 对象,但他们确实为我们提供了工具,让我们可以使用动态对象 http://haacked.com/archive/2009/08/26/method-missing-csharp-4.aspx班级。这是一种方法来满足您对旧设备的要求XmlDocument class.

public class DynamicXmlElement : DynamicObject {
   XmlElement _xmlEl;

   public DynamicXmlElement(string xml) {
      var xmldoc = new XmlDocument();
      xmldoc.LoadXml(xml);
      _xmlEl = xmldoc.DocumentElement;
   }

   public DynamicXmlElement(XmlElement el) {
      _xmlEl = el;
   }

   public override bool TrySetMember(SetMemberBinder binder, object value) {
      return false;
   }

   public override bool TryGetMember(GetMemberBinder binder, out object result) {
      XmlElement el = (XmlElement)_xmlEl.SelectSingleNode(binder.Name);
      if (el != null) {
         // wrap the element we found in a new DynamicXmlElement object
         result = new DynamicXmlElement(el);
         return true;
      }
      else if (binder.Name == "root") {
         // special case for handling references to "root"
         result = new DynamicXmlElement(_xmlEl.OwnerDocument.DocumentElement);
         return true;
      }
      else {
         // feel free to change this to prevent having accidental null reference issues
         // by just setting the result to a DynamicXmlElement with a null element and 
         // handling _xmlEl == null at the start of this method
         result = null;
         return false;
      }
   }

   public override string ToString() {
      return _xmlEl.InnerText;
   }
}

以下是调用代码的方式。请注意,这仅在 C# 4.0 中编译。

namespace ConsoleApplication4 {
   class Program {
      static void Main(string[] args) {
         var xmlstr = "<r><subnode><subsubnode>ABCs of dynamic classes</subsubnode></subnode></r>";
         dynamic xml = new DynamicXmlElement(xmlstr);
         Console.WriteLine(xml.subnode.root.subnode.subsubnode); // take the long way around...
         Console.ReadKey(true);
      }
   }
}

我不能把这一切归功于我。斑竹写了这段代码 http://svn.boo.codehaus.org/browse/boo/trunk/examples/duck-typing/XmlObject.boo?r=1231Boo 早在 2003 年就出现了。C# 已经慢慢获得了 Boo 多年来在 .NET 中所拥有的功能……首先是类型推断,现在是 IQuackFu 风格DynamicObject。一旦他们实现了语言宏以便你可以制作 DSL,我认为他们就会迎头赶上。

我将把这段代码的更新样式的 XElement 版本留给读者。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 XmlDocument 在 .NET 4 中不是动态的? 的相关文章

随机推荐

  • 使用 lxml 向现有元素添加属性、删除元素等

    我使用以下方法解析 XML from lxml import etree tree etree parse test xml etree XMLParser 现在我想处理已解析的 XML 我在删除具有命名空间的元素或仅删除一般元素时遇到问题
  • ConcurrentHashMap 有什么缺点吗?

    我需要一个可从多个线程访问的 HashMap 有两个简单的选项 使用普通的 HashMap 并在其上同步 或者使用 ConcurrentHashMap 由于 ConcurrentHashMap 不会阻止读取操作 因此它似乎更适合我的需求 几
  • 使用 jQuery get(0) 索引暂停和播放多个 HTML5 视频?

    我有一个包含多个视频的页面 人们可以单击缩略图来播放每个视频 问题是 对于超过 2 个视频 单击第三个缩略图不会暂停第二个视频 因此我会同时播放 2 个视频 我也在使用fadeOut 切换每个视频的可见性 无论视频数量多少 这都可以正常工作
  • Postman 的 Chrome 拦截器是否仍可与 Postman 的独立版本一起使用?

    我之前使用过 Postman Chrome 的扩展以及邮递员拦截器扩展 https chrome google com webstore detail postman interceptor aicmkgpgakddgnaphhhpliif
  • python 中的降噪算法不起作用

    我一直在尝试使用noisereduce pypi 算法来减少音频文件的噪音 但它给了我一个错误 Traceback most recent call last File C Users Seif Koretum Desktop noise
  • 谁在 BPF 中创建地图

    看完之后man bpf以及其他一些文档来源 我的印象是map只能由用户进程创建 然而下面这个小程序似乎神奇地 create bpf map struct bpf map def SEC maps my map type BPF MAP TY
  • Docker compose 运行yarn install

    运行该步骤时运行纱线安装在 docker compose build 命令期间的 Dockerfile 中 我得到 1 4 正在解析包 2 4 正在获取包 信息 电子邮件受保护 cdn cgi l email protection 平台 l
  • 在终端中使用 cURL 发布数组

    我正在尝试为应用程序构建网络服务 因此数据存储在我拥有的在线数据库中 我目前正在构建 php 文档 我很好奇如何才能POST an array using cURL in the 终端 Mac 应用程序 您会看到 应用程序将向 Web 服务
  • Firestore - 按降序排序

    在我的 Firestore 数据库中 我有字段索引 no 数据类型是字符串 但数据是数字 如 1 2 3 等 collectionReference orderBy indexNo Query Direction DESCENDING 到9
  • OpenSSL 作为 CA,无需触及 certs/crl/index/etc 环境

    我认为我有正确的 OpenSSL 命令来签署证书 但我陷入了困境 并且我发现的教程使用了不同的参数格式 我使用的是 OpenSSL 0 9 8o 01 Jun 2010 openssl ca cert cert pem keyfile ke
  • Azure DocumentDB 性能缓慢

    我目前面临 Azure DocumentDB 的响应时间相当慢 第一次尝试 集合中有 31 个对象 我将获取这些对象并将其返回给调用者 我正在使用的代码是这样的 public async Task
  • Clojure 中的原子文件替换

    我有一个可以写入更新磁盘文件的应用程序 但我想尽可能确保文件的先前版本不会损坏 当然 更新文件最直接的方法就是简单地编写 spit myfile txt mystring 但是 如果 PC 或 java 进程 在写入过程中死机 则有很小的机
  • 检索 HTML 元素的位置 (X,Y)

    我想知道如何获取 HTML 元素的 X 和 Y 位置 例如img and div在 JavaScript 中 正确的方法是使用element getBoundingClientRect https developer mozilla org
  • 无法在多线程的正确文件上写入日志?

    我已发布问题 如何使用java在多线程中使用log4j https stackoverflow com questions 8226615 how to use log4j in multithread using java 我得到了回复
  • 避免在 JavaScript 中转义特殊字符

    我的服务器返回值为support testing 当我在客户端获得这个值时 它可以被转义为support testing t作为制表符空格转义 如何避免在 JavaScript 中转义特殊字符 您的服务器需要使用正确的转义来输出字符串 在这
  • 如何有效地发送大数据包/合并较小的数据包?

    我有一个更大的缓冲区 我试图作为数据包发送 Nodejs 将缓冲区分割成更小的 65k 数据包 一旦客户端收到它们 我如何确保数据包组合在一起并有效地将它们重新组合到缓冲区中 几乎用这个作为测试 tcp socket var buf Buf
  • HTTP 400 的 Spring MVC 自定义消息

    我有几个像下面这样的 SprigMVC 方法 返回 ModelAndView 或 Responsebody 当用户向这些缺少所需参数的网址发出请求时 他们自然会收到消息 所需的字符串参数 id 不存在 从安全角度来看我想隐藏此详细描述消息来
  • Python 获得正确的行结尾

    有没有一种简单的方法来获取当前操作系统使用的行结束类型 如果您正在操作以文本模式打开的文件 那么换行符全部显示为 是正确的 n 否则 您正在寻找os linesep http docs python org library os html
  • 是否可以用 ISO 8601 表示开放式时间间隔?

    ISO 8601 包括几种表示方法时间间隔 https en wikipedia org wiki ISO 8601 Time intervals 开始 结束 开始 持续时间 持续时间 结束 duration 例如 1990 1999是一个
  • 为什么 XmlDocument 在 .NET 4 中不是动态的?

    我希望看到使用的领域之一dynamic是XML 我认为这将使 XML 处理代码编写起来更简单 并且我相信在 C 4 出现之前我看到了一些示例 并且提到了它在这个答案中 https stackoverflow com questions 22