在OmniXML中的NodeAttributes中添加换行符

时间:2017-01-10 07:57:32

标签: delphi delphi-7 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;

我希望将每个链接放在一个单独的行上:

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

1 个答案:

答案 0 :(得分:2)

OmniXML不提供输出格式的细粒度控制。您可能希望找到一个可以满足您需求的外部XML漂亮打印机。或者你甚至可以编写自己的XML库。

在你再进一步之前,我想说明XML从未打算被人类阅读。它的设计不遗余力,如果你继续努力使你的XML尽可能可读,那么你将会逆流而上。如果你想要一个人类可读的结构化文件格式,那么你可能会看一下YAML,而YAML就是为此而设计的。

另一个需要考虑的途径是XML的结构。使用节点属性指定值数组是一个糟糕的决定。属性旨在与名称/值映射对一起使用。如果要指定值数组,则可以这样执行:

<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的格式,那么这一切都没有实际意义。