我在Delphi 7中创建一个XML文件。我想从代码中删除父节点的声明。

这是我的代码:

var
  XML : IXMLDOCUMENT;
  RootNode, CurNode : IXMLNODE;
begin
  XML := NewXMLDocument;
  XML.Encoding := 'utf-8';
  XML.Options := [doNodeAutoIndent]; // looks better in Editor ;)
  RootNode := XML.AddChild('p:test');
  RootNode.Attributes['xmlns:ds'] := 'Attributes1';
  RootNode.Attributes['xmlns:p'] := 'Attributes2';
  RootNode.Attributes['versione'] := 'FPR12';

  CurNode := RootNode.AddChild('HeadNode');

  CurNode := CurNode.AddChild('SubNode');
  CurNode.Text := 'Test';
  CurNode := CurNode.ParentNode;

  CurNode := CurNode.AddChild('Codice');
  CurNode.Text := '01234567890';
  CurNode := CurNode.ParentNode;

  CurNode := CurNode.ParentNode;

  s := 'C:\Users\web\Desktop\file.xml';
  XMl.SaveToFile(s);
end;


这是我的结果:

<?xml version="1.0" encoding="utf-8"?>
<p:test xmlns:ds="Attributes1" xmlns:p="Attributes2" versione="FPR12">
  <p:HeadNode>
    <p:SubNode>Test</p:SubNode>
    <p:Codice>01234567890</p:Codice>
  </p:HeadNode>
</p:test>


这就是我所期望的(请注意,HeadNode及其嵌套节点上缺少“ p:”):

<?xml version="1.0" encoding="utf-8"?>
<p:test xmlns:ds="Attributes1" xmlns:p="Attributes2" versione="FPR12">
  <HeadNode>
    <SubNode>Test</SubNode>
    <Codice>01234567890</Codice>
  </HeadNode>
</p:test>


我怎么能得到这个?

最佳答案

这是正常现象,在父节点下创建的任何节点都将携带父节点的名称空间。由于您希望节点HeadNode不包含名称空间,因此在创建该节点时必须分配一个空的名称空间。如果查看函数TXMLNode.AddChild,您将看到有一个重载函数,该函数接受第二个参数,该参数代表该节点的NameSpaceUri
因此,要修复XML,您要做的就是将行CurNode := RootNode.AddChild('HeadNode');更改为CurNode := RootNode.AddChild('HeadNode', '');

编译示例:

program SO58008911;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  ActiveX,
  XMLIntf,
  XMLDoc,
  System.SysUtils;

procedure TestXML;
var
  XML : IXMLDOCUMENT;
  RootNode, CurNode : IXMLNODE;
begin
  XML := NewXMLDocument;
  XML.Encoding := 'utf-8';
  XML.Options := [doNodeAutoIndent]; // looks better in Editor ;)
  RootNode := XML.AddChild('p:test');
  RootNode.Attributes['xmlns:ds'] := 'Attributes1';
  RootNode.Attributes['xmlns:p'] := 'Attributes2';
  RootNode.Attributes['versione'] := 'FPR12';
  CurNode := RootNode.AddChild('HeadNode', '');
  CurNode := CurNode.AddChild('SubNode');
  CurNode.Text := 'Test';
  CurNode := CurNode.ParentNode;
  CurNode := CurNode.AddChild('Codice');
  CurNode.Text := '01234567890';
  Writeln(XML.XML.Text);
end;

begin
  try
   CoInitialize(nil);
   try
    TestXML;
   finally
    CoUninitialize;
   end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
 Readln;
end.


输出:

<?xml version="1.0"?>
<p:test xmlns:ds="Attributes1" xmlns:p="Attributes2" versione="FPR12">
  <HeadNode>
    <SubNode>Test</SubNode>
    <Codice>01234567890</Codice>
  </HeadNode>
</p:test>

关于xml - 消除xml文件的声明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58008911/

10-09 05:25