[经验总结]利用MSXML在不同DOM树之间拷贝结点

2024-03-30 23:48

本文主要是介绍[经验总结]利用MSXML在不同DOM树之间拷贝结点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先还是看一段代码:

 

写这段代码的目的是想从不同XML/HTML 文件抽取信息拼接成一个打印页面(HTML),类似于报表打印的功能。 实现利用XPath语句提取源路径中的所有子结点,将其添加到目标路径下。实现时遇到两个难点,第一个是IXMLDOMDocument不支持命名空间,也就是说IXMLDOMDocument类型的文档结点对象不支持带命名空间的路径导航。微软的东西做得很奇怪,//Xpath 这个路径居然可以深入到带命名空间的路径中查找查找,这是与XPath标准不符合的,但却能方便用//anyNode 这样的方式提取带命名空间的结点。我们用到selectNodes,所以提取属性结点时需要在最后加一个text()函数。另外需要注意的是从当前结点出来访问路径需要加一个点(.),不然会根结点开始访问。 每二个难点跨DOM树添加结点,没想到appendChild直接支持这个功能,只不过调用方式比较特殊,非得在后面加个NULL参数。被添加的结点其命名空间 不变。

      最近经常用MSXML,相对于以前使用的Libxml,这一套API设计得还是比较方便,但是因为微软一贯的传统不开放源代码,很多细节文档中说不清或者干脆不提及,所以实现过程有1/3的时间是在与这些未知的细节斗争。还是怀念使用Libxml的日子,花一下午时间研究研究Libxml库的基本数据结构,以前遇到问题就能迎韧而解,还能根据实际情况灵活调用API。因为开源,所以能对其数据结构、实现方式做心中有数,进而能心中有沟壑,键下自风云。


       突然又想起Eric Raymond笔下的那个猪小兵:" 一切都要比他想的费时和痛苦。在程序库表面光鲜的示例程序下,正在重用的组件似乎在一些边界情况下表现得无法预料或具有破坏性--而这些边界情况在他的代码中常遇到。小兵经常奇怪写程序库的家伙是怎么想的。但他没法知道,因为组件的文档不全--那些文档是技术文员写的,他们既不是程序员,想问题的方式也不像程序员。他也不能通过阅读源码来了解程序究竟是干什么的,因为程序库是处于专有许可证下不透明的目标码。“

       Windows程序员遇到很多麻烦(编码效率和质量方面)和猪小兵一样的,这些问题归根结底是透明性。微软提供的API都缺乏透明性,很多人捧着MSDN沾沾自喜,却不知项目的灾难来自那里。我们无法修正不通内情的东西。实际上,任何规模大一些的API,如果无法看到源代码,是无法正确使用的。只有文档,还不能指导实践。文档并不能传达代码的所有细微差别之处,而“魔鬼”恰巧是隐藏在细节之中。

       抱怨归抱怨,工作还是得干好。Windows的闭源开发方式应该也有一定规律,接下来得看看别人是怎么做的。

 

这篇关于[经验总结]利用MSXML在不同DOM树之间拷贝结点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/862906

相关文章

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Python Flask实现定时任务的不同方法详解

《PythonFlask实现定时任务的不同方法详解》在Flask中实现定时任务,最常用的方法是使用APScheduler库,本文将提供一个完整的解决方案,有需要的小伙伴可以跟随小编一起学习一下... 目录完js整实现方案代码解释1. 依赖安装2. 核心组件3. 任务类型4. 任务管理5. 持久化存储生产环境

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J