如何检测 SVG XML 中的节点类型错误并可能修复它?

How to detect node-type error in SVG XML and possibly fix it?

在 Delphi 10.4.1 中,我使用此代码重新格式化 TMemo 中的 XML:

procedure TForm1.MyMemoFormatXML;
var
  ThisXML: IXMLDocument;
begin
  ThisXML := TXMLDocument.Create(nil);
  ThisXML.XML.Assign(Memo1.Lines);
  ThisXML.XML.Text := xmlDoc.FormatXMLData(ThisXML.XML.Text);
  ThisXML.Active := True;
  Memo1.Lines.Assign(ThisXML.XML);
end;

某些 XML 数据在使用 MyMemoFormatXML 过程时会导致“无效节点类型”错误消息,例如(XML 来自 SVG 文件):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="32px" height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
  <g id="icon">
    <path d="M28.4638,1.6295l0.283,6.0073c0.0116,0.2453,-0.1848,0.4505,-0.4312,0.4505h-0.0188c-0.214,0,-0.3952,-0.1573,-0.4269,-0.3683c-0.1577,-1.0518,-0.3632,-1.817,-0.6164,-2.2956c-0.4604,-0.8581,-1.0729,-1.4908,-1.8374,-1.898c-0.765,-0.4069,-1.7708,-0.5255,-3.018,-0.5255H18v22.9128c0,1.85,0.2005,2.8884,0.6014,3.3469c0.5641,0.6215,1.5768,0.9324,2.7499,0.9324h0.6348c0.2276,0,0.412,0.1839,0.412,0.4107v0c0,0.2268,-0.1845,0.4107,-0.412,0.4107H10.0593c-0.2276,0,-0.412,-0.1839,-0.412,-0.4107v0c0,-0.2268,0.1845,-0.4107,0.412,-0.4107h0.6571c1.2768,0,2.2591,-0.3847,2.7936,-1.1543c0.3264,-0.4734,0.49,-1.4379,0.49,-3.125V3h-3.7069c-1.4108,0,-2.4131,0.0188,-3.0068,0.2259c-0.7723,0.2813,-1.4331,0.8213,-1.9823,1.6205c-0.4969,0.7226,-0.8116,1.6751,-0.944,2.8573c-0.0244,0.2179,-0.2084,0.3837,-0.4284,0.3837h0c-0.2469,0,-0.4435,-0.2061,-0.4311,-0.4519l0.3019,-6.0081C3.8202,1.2759,4.1113,1,4.4644,1h23.3373C28.1556,1,28.4471,1.2771,28.4638,1.6295z" fill="#3E78B3"/>
  </g>
</svg>

如何检测故障节点并修复它?

EDIT1: 即使我使用这个简化的代码,我也会得到同样的错误:

Memo1.Lines.Text := FormatXMLData(Memo1.Lines.Text);

EDIT2: GetlastError: 进程已成功完成。

EDIT3: 我在这里找到了一个 Delphi TIDY 包装器:https://sourceforge.net/projects/curlpas/ 不幸的是,它缺少任何文档。那么如何使用包含的 tidyobj.pas 来清理 XML?

使用 TIDY,可以找到并修复任何结构 XML 错误:

• 测试 XML/SVG 文件中的错误:

tidy.exe -errors -xml inputfile.xml

• 修复错误并重新格式化(整理)XML 内容:

tidy.exe -q -xml inputfile.xml