加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi xmlchildnode从父级获取属性

发布时间:2020-12-15 09:20:53 所属栏目:大数据 来源:网络整理
导读:我想在Delphi中编写一个xML. 如果我为节点添加了一个xmlns属性,那么该节点的子节点也会显示该属性,但后来为空.如何确保子节点显示属性? 我测试了以下代码 procedure TForm2.Button1Click(Sender: TObject);var RootNode,CurNode,PmtNode,PmtDetNode : IXMLN
我想在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>

谢谢
Rob Nowee

解决方法

由于Child1的子元素不带有相同的命名空间,因此它必须是未声明的,这就是Child2持有空(默认)命名空间的原因.

这被称为Namespace undeclaration

When an element carries the attribute xmlns=””,the default namespace for that element and its descendants reverts to “no namespace”: that is,unprefixed names are considered not to be in any namespace.

XML Namespaces 1.1 also introduces the option to undeclare other namespace prefixes. For example,if the attribute xmlns:p=”” appears on an element,the namespace prefix p is no longer in scope (and therefore cannot be used) on that element or on its descendants,unless reintroduced by another namespace declaration

话虽如此,修复很简单;在所有后续子节点上包含命名空间:

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>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读