delphi xmlchildnode从父级获取属性
我想在Delphi中编写一个xML.
如果我为节点添加了一个xmlns属性,那么该节点的子节点也会显示该属性,但后来为空.如何确保子节点显示属性? 我测试了以下代码 procedure TForm2.Button1Click(Sender: TObject); var RootNode,CurNode,PmtNode,PmtDetNode : IXMLNODE; I:Integer; begin SepaDoc := Newxmldocument; SepaDoc.Encoding := 'utf-8'; SepaDoc.Options := [doNodeAutoIndent]; RootNode := SepaDoc.AddChild('Document'); CurNode := RootNode.AddChild('Child1'); CurNode.Attributes['xmlns'] := 'apenootje'; CurNode := CurNode.AddChild('Child2'); CurNode := CurNode.AddChild('Child3'); SepaDoc.SaveToFile('D:indirtestsepa.xml'); end; 这导致以下XML <?xml version="1.0" encoding="UTF-8"?> -<Document> -<Child1 xmlns="apenootje"> -<Child2 xmlns=""> <Child3/> </Child2> </Child1> </Document> 谢谢 解决方法
由于Child1的子元素不带有相同的命名空间,因此它必须是未声明的,这就是Child2持有空(默认)命名空间的原因.
这被称为Namespace undeclaration
话虽如此,修复很简单;在所有后续子节点上包含命名空间: program SO20424534; {$APPTYPE CONSOLE} uses ActiveX,XMLdom,XMLDoc,XMLIntf,SysUtils; function TestXML : String; var RootNode,CurNode : IXMLNODE; Doc : IXmlDocument; ns : String; begin Doc := Newxmldocument; ns := 'apenootje'; Doc.Encoding := 'utf-8'; Doc.Options := [doNodeAutoIndent]; RootNode := Doc.AddChild('Document'); CurNode := RootNode.AddChild('Child1'); CurNode.DeclareNamespace('',ns); CurNode := CurNode.AddChild('Child2',ns); CurNode := CurNode.AddChild('Child3',ns); Result := Doc.XML.Text; end; begin try CoInitialize(nil); try Writeln(TestXML); finally CoUninitialize; end; except on E: Exception do Writeln(E.ClassName,': ',E.Message); end; Readln; end; 输出: <?xml version="1.0"?> <Document> <Child1 xmlns="apenootje"> <Child2> <Child3/> </Child2> </Child1> </Document> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |