[经验总结]利用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

相关文章

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

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

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

Python实现PDF与多种图片格式之间互转(PNG, JPG, BMP, EMF, SVG)

《Python实现PDF与多种图片格式之间互转(PNG,JPG,BMP,EMF,SVG)》PDF和图片是我们日常生活和工作中常用的文件格式,有时候,我们可能需要将PDF和图片进行格式互转来满足... 目录一、介绍二、安装python库三、Python实现多种图片格式转PDF1、单张图片转换为PDF2、多张图

Java对象和JSON字符串之间的转换方法(全网最清晰)

《Java对象和JSON字符串之间的转换方法(全网最清晰)》:本文主要介绍如何在Java中使用Jackson库将对象转换为JSON字符串,并提供了一个简单的工具类示例,该工具类支持基本的转换功能,... 目录前言1. 引入 Jackson 依赖2. 创建 jsON 工具类3. 使用示例转换 Java 对象为

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明