C++ MSXML DOM:将命名空间声明添加到树中的现有节点
问题描述:读取xml文件,遍历到特定节点(元素),如果它没有特定的命名空间声明,则添加所需的命名空间声明,然后写出该文件 我需要用C++的微软MSXML DOM API来实现这一点。根据此msdn,IXMLDOMNode COM对象上的namespaceURI属性是只读的。感谢任何变通方法 编辑:我花了相当长的时间在一个变通方法上:在同一文档中创建一个具有我需要的名称空间的新同级节点,然后将原始节点的所有子元素移动到此新节点,然后删除原始节点。这是行不通的,因为子节点将保留它们以前拥有的任何默认名称空间C++ MSXML DOM:将命名空间声明添加到树中的现有节点,c++,xml,dom,namespaces,msxml,C++,Xml,Dom,Namespaces,Msxml,问题描述:读取xml文件,遍历到特定节点(元素),如果它没有特定的命名空间声明,则添加所需的命名空间声明,然后写出该文件 我需要用C++的微软MSXML DOM API来实现这一点。根据此msdn,IXMLDOMNode COM对象上的namespaceURI属性是只读的。感谢任何变通方法 编辑:我花了相当长的时间在一个变通方法上:在同一文档中创建一个具有我需要的名称空间的新同级节点,然后将原始节点的所有子元素移动到此新节点,然后删除原始节点。这是行不通的,因为子节点将保留它们以前拥有的任何默认
然后这个简单的想法打动了我,它起了作用,但我不确定它将来是否会咬我:只需在元素上创建一个“xmlns”属性,给它所需的名称空间值!有任何注释吗?猜测您的意思是要向元素添加默认名称空间,首先要理解这是不可能的。元素名称所属的名称空间形成了它的完全限定名称,因此“添加”默认名称空间等同于重命名元素。DOM中没有内置重命名元素的机制 最严格的方法是将XML作为转换的输入进行处理(通过代码或XSLT),以生成正确的XML输出
然而,一个实用的解决方案是使用一些字符串处理(如RegEx)来查找元素并注入xmlns属性。就我个人而言,我更喜欢前者。猜测您的意思是为元素添加一个默认名称空间,首先要理解这是不可能的。元素名称所属的名称空间形成了它的完全限定名称,因此“添加”默认名称空间等同于重命名元素。DOM中没有内置重命名元素的机制 最严格的方法是将XML作为转换的输入进行处理(通过代码或XSLT),以生成正确的XML输出
然而,一个实用的解决方案是使用一些字符串处理(如RegEx)来查找元素并注入xmlns属性。就我个人而言,我更喜欢前者。您的意思是要为本应指定名称空间的元素添加默认名称空间吗?e、 g.xmlns=“someuri”您的意思是要将默认名称空间添加到本应分配名称空间的元素中吗?e、 g.xmlns=“someuri”