在 OmniXML 的 NodeAttributes 中添加换行符

Adding line break in NodeAttributes in OmniXML

我有一个 XML,其中一个节点有多个属性:

var
  row  : IXMLNode;
  rowattr : IXMLAttr;
  xml  : IXMLDocument;
begin
  xml := ConstructXMLDocument('xml');
  SetNodeAttr(xml.DocumentElement, 'version', '1.0');
  SetNodeAttr(xml.DocumentElement, 'encoding', 'UTF-8');
  row := AppendNode(xml, 'Links');
  rowattr:=xml.CreateAttribute('Link1');
  rowattr.Value:='http:\wwww.somelink1.com';
  row.Attributes.SetNamedItem(rowattr);
  rowattr:=xml.CreateAttribute('Link2');
  rowattr.Value:='http:\wwww.somelink2.com';
  row.Attributes.SetNamedItem(rowattr);
  rowattr:=xml.CreateAttribute('Link3');
  rowattr.Value:='http:\wwww.somelink3.com';
  row.Attributes.SetNamedItem(rowattr);
  XMLSaveToFile(xml, 'C:\Test1.xml', ofIndent);
end;

我希望每个 link 像这样单独一行:

<xml version="1.0" encoding="UTF-8">
  <Links
  link1="http://www.somelink1.com" 
  link2="http://www.somelink2.com"
  link3="http://www.somelink3.com" 
  />
</xml>

OmniXML 不提供对输出格式的这种细粒度控制。您或许可以寻找一台外部 XML 漂亮的打印机来满足您的需求。或者您甚至可以编写自己的 XML 库。

在你继续之前,我想指出一点,XML 从未打算被人类阅读。它的设计没有努力提高可读性,如果您继续尝试使您的 XML 尽可能可读,那么您将逆流而上。如果您想要一种人类可读的结构化文件格式,那么您可能会考虑考虑到这一点而设计的 YAML。

另一个需要考虑的途径是 XML 的结构。使用节点属性来指定值数组是一个糟糕的决定。属性旨在与 name/value 映射对一起使用。如果你想指定一个值数组,那么你可以这样做:

<links>
    <item>http://www.somelink1.com</item>
    <item>http://www.somelink2.com</item>
    <item>http://www.somelink3.com</item>
</links>

这比您的 XML 更清晰,也更容易解析。尝试编写代码来解析您的属性,您就会明白我的意思。

现在,为了说明我上面的观点,在 YAML 中这将是:

Links:
    - http://www.somelink1.com
    - http://www.somelink2.com
    - http://www.somelink3.com

当然,如果您以外的其他人正在定义 XML 的格式,那么所有这些都没有实际意义。