如何从特定子节点移除 XML 命名空间

问题描述 投票:0回答:0

我正在编写一个 Delphi (10.4) 程序来将数据库导出为 XML。目的是将 .xml 文件直接打开到 Excel 中。我正在使用工作 .xml 作为需要导出内容的基础。当我尝试打开导出的文件时,出现错误“此文件因错误而无法打开。”我已经将它缩小到 .xml 中的一行。

<Styles xmlns="urn:schemas-microsoft-com:office:office">
在原来的这只是如下:
<Styles>
这是根的子节点。在此之前的子节点在原始文件和导出文件中具有相同的xmlns。 下面是我正在使用的代码。

procedure TForm1.btnSaveClick(Sender: TObject);
var
  XML : IXMLDOCUMENT;
  RootNode, CurNode, ChildNode, ChildNode2, ChildNode3 : IXMLNODE;
  ns, nso, nsx, nsss, nshtml : String;
begin
  XML := NewXMLDocument;
  XML.Options := [doNodeAutoIndent]; // looks better in Editor ;)
  ns := 'urn:schemas-microsoft-com:office:spreadsheet';
  nso := 'urn:schemas-microsoft-com:office:office';
  nsx:= 'urn:schemas-microsoft-com:office:excel';
  nsss := 'urn:schemas-microsoft-com:office:spreadsheet';
  nshtml := 'http://www.w3.org/TR/REC-html40';

  RootNode := XML.AddChild('Workbook');
    RootNode.DeclareNamespace('', ns);
    RootNode.DeclareNamespace('o', nso);
    RootNode.DeclareNamespace('x', nsx);
    RootNode.DeclareNamespace('ss', nsss);
    RootNode.DeclareNamespace('html', nshtml);

    CurNode := RootNode.AddChild('DocumentProperties');/////////////////////////DocumentProperties
    CurNode.DeclareNamespace('', nso);
      ChildNode := CurNode.AddChild('Author', nso);
        ChildNode.Text := 'File Author';
      ChildNode := CurNode.AddChild('LastAuthor', nso);
        ChildNode.Text := 'File Editor';
      ChildNode := CurNode.AddChild('Created', nso);
        ChildNode.Text := DateToStr(Now);
      ChildNode := CurNode.AddChild('LastSaved', nso);
        ChildNode.Text := DateToStr(Now);
      ChildNode := CurNode.AddChild('Version', nso);
        ChildNode.Text := '16.00';

    CurNode := RootNode.AddChild('OfficeDocumentSettings');/////////////////////OfficeDocumentSettings
    CurNode.DeclareNamespace('', nso);
      ChildNode := CurNode.AddChild('AllowPNG', nso);

     CurNode := RootNode.AddChild('ExcelWorkbook');/////////////////////////////ExcelWorkbook
     CurNode.DeclareNamespace('', nso);
      ChildNode := CurNode.AddChild('WindowHeight', nso);
        ChildNode.Text := '8976';
      ChildNode := CurNode.AddChild('WindowWidth', nso);
        ChildNode.Text := '23040';
      ChildNode := CurNode.AddChild('WindowTopX', nso);
        ChildNode.Text := '32767';
      ChildNode := CurNode.AddChild('WindowTopY', nso);
        ChildNode.Text := '32767';
      ChildNode := CurNode.AddChild('ProtectStructure', nso);
        ChildNode.Text := 'False';
      ChildNode := CurNode.AddChild('ProtectWindows', nso);
        ChildNode.Text := 'False';


    CurNode := RootNode.AddChild('Styles');/////////////////////////////////////Styles
      ChildNode := CurNode.AddChild('Style', nso);
        ChildNode.Attributes['ss:ID'] := 'Default';
        ChildNode.Attributes['ss:Name'] := 'Normal';
          ChildNode2 := ChildNode.AddChild('Alignment', nso);
            ChildNode2.Attributes['ss:Vertical'] := 'Bottom';
          ChildNode2 := ChildNode.AddChild('Borders', nso);
          ChildNode2 := ChildNode.AddChild('Font', nso);
            ChildNode2.Attributes['ss:FontName'] := 'Calibri';
            ChildNode2.Attributes['x:Family'] := 'Swiss';
            ChildNode2.Attributes['ss:Size'] := '11';
            ChildNode2.Attributes['ss:Color'] := '#000000';
          ChildNode2 := ChildNode.AddChild('Interior', nso);
          ChildNode2 := ChildNode.AddChild('NumberFormat', nso);
          ChildNode2 := ChildNode.AddChild('Protection', nso);

       ChildNode := CurNode.AddChild('Style', nso);
        ChildNode.Attributes['ss:ID'] := 's64';
          ChildNode2 := ChildNode.AddChild('Alignment', nso);
            ChildNode2.Attributes['ss:Vertical'] := 'Center';
            ChildNode2.Attributes['ss:WrapText'] := '1';
          ChildNode2 := ChildNode.AddChild('Borders', nso);
            ChildNode3 := ChildNode2.AddChild('Border', nso);
              ChildNode3.Attributes['ss:Position'] := 'Right';
              ChildNode3.Attributes['ss:LineStyle'] := 'Continuous';
              ChildNode3.Attributes['ss:Weight'] := '1';
              ChildNode3.Attributes['ss:Color'] := '#FFFFFF';
          ChildNode2 := ChildNode.AddChild('Font', nso);
            ChildNode2.Attributes['ss:FontName'] := 'Calibri';
            ChildNode2.Attributes['x:Family'] := 'Swiss';
            ChildNode2.Attributes['ss:Size'] := '11';
            ChildNode2.Attributes['ss:Color'] := '#FFFFFF';
          ChildNode2 := ChildNode.AddChild('Interior', nso);
            ChildNode2.Attributes['ss:Color'] := '#44546A';
            ChildNode2.Attributes['ss:Pattern'] := 'Solid';

        ChildNode := CurNode.AddChild('Style', nso);
        ChildNode.Attributes['ss:ID'] := 's65';
          ChildNode2 := ChildNode.AddChild('Alignment', nso);
            ChildNode2.Attributes['ss:Vertical'] := 'Center';
            ChildNode2.Attributes['ss:WrapText'] := '1';
          ChildNode2 := ChildNode.AddChild('Borders', nso);
            ChildNode3 := ChildNode2.AddChild('Border', nso);
              ChildNode3.Attributes['ss:Position'] := 'Left';
              ChildNode3.Attributes['ss:LineStyle'] := 'Continuous';
              ChildNode3.Attributes['ss:Weight'] := '1';
              ChildNode3.Attributes['ss:Color'] := '#FFFFFF';
            ChildNode3 := ChildNode2.AddChild('Border', nso);
              ChildNode3.Attributes['ss:Position'] := 'Right';
              ChildNode3.Attributes['ss:LineStyle'] := 'Continuous';
              ChildNode3.Attributes['ss:Weight'] := '1';
              ChildNode3.Attributes['ss:Color'] := '#FFFFFF';
          ChildNode2 := ChildNode.AddChild('Font', nso);
            ChildNode2.Attributes['ss:FontName'] := 'Calibri';
            ChildNode2.Attributes['x:Family'] := 'Swiss';
            ChildNode2.Attributes['ss:Size'] := '11';
            ChildNode2.Attributes['ss:Color'] := '#FFFFFF';
          ChildNode2 := ChildNode.AddChild('Interior', nso);
            ChildNode2.Attributes['ss:Color'] := '#44546A';
            ChildNode2.Attributes['ss:Pattern'] := 'Solid';

      ChildNode := CurNode.AddChild('Style', nso);
        ChildNode.Attributes['ss:ID'] := 's66';
          ChildNode2 := ChildNode.AddChild('Alignment', nso);
            ChildNode2.Attributes['ss:Vertical'] := 'Bottom';
            ChildNode2.Attributes['ss:WrapText'] := '1';

  XMl.SaveToFile('export.xml');
end;

我折叠了原始和导出的XML文件的屏幕截图以显示子节点。

Original

Exported

我尝试添加和删除命名空间,但我无法让

<Styles>
没有任何 xmlns - 我得到的最好的是
<Styles xmlns="">
这给了我同样的错误。

请注意:Worksheet 子节点不在程序中,因为我仍然需要到达该部分。为了测试,我从原始 XML 文件中复制了数据。

delphi xml-namespaces delphi-10.4-sydney
© www.soinside.com 2019 - 2024. All rights reserved.