Delphi创建OpenXML的app.xml时子节点自动添加xmlns属性如何解决
问题原因
这是XML命名空间继承逻辑导致的问题。Delphi的XML组件只会自动继承父节点创建时指定的命名空间,你之前是先创建Properties节点,再手动给它追加xmlns属性,此时子节点创建时识别到的父节点默认命名空间为空,序列化时为了标记子节点不属于父节点的默认命名空间,就自动给所有子节点加上了xmlns=""的重置声明。
解决方法
创建节点时主动指定命名空间即可,无需额外配置组件属性,实现代码如下:
const // 扩展属性默认命名空间 EXT_PROPS_NS = 'http://schemas.openxmlformats.org/officeDocument/2006/extended-properties'; // VTypes命名空间 VT_NS = 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes'; var Root: IXMLNode; Rel: IXMLNode; begin // 可选:开启自动缩进,生成的XML格式更整齐 XMLDocument1.Options := XMLDocument1.Options + [doNodeAutoIndent]; // 创建根节点时直接指定默认命名空间,不要后续手动加xmlns属性 Root := XMLDocument1.AddChild('Properties', EXT_PROPS_NS); // 声明vt命名空间 Root.DeclareNamespace('vt', VT_NS); // 所有子节点创建时都传入根节点的默认命名空间 Rel := Root.AddChild('Template', EXT_PROPS_NS); Rel.Text := 'Normal.dotm'; Rel := Root.AddChild('TotalTime', EXT_PROPS_NS); Rel.Text := '1'; Rel := Root.AddChild('Pages', EXT_PROPS_NS); Rel.Text := '1'; Rel := Root.AddChild('Words', EXT_PROPS_NS); Rel.Text := '1'; // 其他节点按相同规则添加即可 // ... end;
生成的XML将完全符合OpenXML格式要求,不会再出现多余的xmlns=""属性。
内容的提问来源于stack exchange,提问作者L Vincent
相关产品推荐
相关产品推荐

