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

相关文章

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

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、多张图